计算字符串开头和结尾的空格(ASCII码32)数量。

7

我正在处理以下问题。我有一个包含这种数据的列:

'abbb ccc   '
'    aaa abbb ccc'
'abbb ccc   '
'   aaa abbb ccc   '
'   ccc'
'aaa abbb'

我希望您能够翻译以下内容:

我想要计算每个字符串左侧和右侧的空格数量。


10
获取同一字符串的总长度减去修剪后的长度。 - tonypdmtr
5个回答

6
尝试使用LENLTRIMREVERSE的组合:
SELECT
    LEN(col) - LEN(LTRIM(col)) AS num_left,
    LEN(REVERSE(col)) - LEN(LTRIM(REVERSE(col))) AS num_right
FROM yourTable;

演示

如下方评论中 @AaronDietz 所提到的,LEN 实际上也可以去除右侧空格。但是 LEN 不会影响左侧空格。为了弥补这一点,我们可以先翻转字符串,然后使用 LTRIM 进行计算。


3
为什么不直接使用datalength呢?这比像那样使用reverse要简单得多。 :) 使用 datalength(col) - len(col) 代替 RightCount。 - Sean Lange
你好 Tim,非常感谢。 - Guilherme

4
DECLARE @s NVARCHAR(50)='abbb ccc   '
DECLARE @t NVARCHAR(50)='    aaa abbb ccc'
SELECT
    RightSpaces = LEN(RTRIM(REVERSE(@s))) - LEN(@s),
    LeftSpaces = LEN(@t) - LEN(LTRIM(REVERSE(@t)))

输出

RightSpaces LeftSpaces
3           4

或者您可以使用DATALENGTH并删除对REVERSE的需求

SELECT
    LeftSpaces  = (DATALENGTH(@s)- DATALENGTH(RTRIM(@s)))/2,
    RightSpaces = (DATALENGTH(@t)- DATALENGTH(LTRIM(@t)))/2

输出

RightSpaces LeftSpaces
3           4

你好Mazhar,非常感谢。 - Guilherme

2

你可以放弃使用 LENTRIM 函数,改用 PATINDEX 函数:

SELECT
    str,
    PATINDEX('%[^ ]%', str) - 1 AS leading_spaces,
    PATINDEX('%[^ ]%', REVERSE(str)) - 1 AS trailing_spaces
FROM testdata

输出:

| str                | leading_spaces | trailing_spaces |
+--------------------+----------------+-----------------+
| abbb·ccc···        | 0              | 3               |
| ····aaa·abbb·ccc   | 4              | 0               |
| abbb·ccc···        | 0              | 3               |
| ···aaa·abbb·ccc··· | 3              | 3               |
| ···ccc             | 3              | 0               |
| aaa·abbb           | 0              | 0               |

SQL Fiddle


1
使用datalength获取完整长度
len将进行右截取
declare @t varchar(100) = '   abbb ccc     ';

select len(@t) as 'len', datalength(@t) as 'datalength',
       datalength(@t) - datalength(ltrim(@t)) as 'left',
       datalength(@t) - datalength(rtrim(@t)) as 'right'

你好Thorsten,谢谢 :) 是的,在每个字符集中字节数是相同的。 - Guilherme
我认为OP的数据类型是CHAR(32),而不是varchar(从标题中),尽管他没有具体说明。 - EzLo
对于右侧,我会使用len而不是datalength - rtrim。当一个函数可以完成同样的任务时,这似乎有点奇怪。 :) - Sean Lange
1
@Sean Lange:是的,utf-32。尝试使用select datalength(N' ')。当我运行此命令时,空格占用两个字节。 - Thorsten Kettner
1
@ThorstenKettner 点在于 / datalength(' ') 无法解决问题。如果你知道它是 nvarchar 类型,那就除以 2。 - paparazzo
显示剩余9条评论

0

你可以这样做...

SELECT Len(col + 'End') - Len(Rtrim(col)) - 3 AS Rno, 
       Len(col) - Len(Ltrim(col))             AS Lno 

由于LEN函数不包括尾随空格,您可以在字符串末尾添加额外的文本,然后稍后删除该文本的长度。
请参考以下示例(4个空格)

SELECT LEN('test ') = 4
SELECT LEN('test ' + 'End') = 11
SELECT LEN('test ' + 'End') - 3 = 8


这是一种奇怪的处理方式。我猜它能工作,但很奇怪。 - Sean Lange
@SeanLange,这样尾随空格就不会被删除了。 :) - DxTx
我理解这一点,但这是一种非常奇怪的处理方式。你可以使用datalength来计算所有空格。 - Sean Lange
@SeanLange,datalength不能解决问题。请参考此示例:http://rextester.com/SXEV41589 `Declare @x NVARCHAR(10) = 'test'; DECLARE @y CHAR(10)='test'; SELECT DATALENGTH('Test'); SELECT DATALENGTH(N'Test'); SELECT DATALENGTH(@x); SELECT DATALENGTH(@y);` 结果:4、8、8、10。 - DxTx
是的,但这并不像单个列会更改数据类型一样。您只需要处理手头列的数据类型即可。 - Sean Lange

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接