我正在处理以下问题。我有一个包含这种数据的列:
'abbb ccc '
' aaa abbb ccc'
'abbb ccc '
' aaa abbb ccc '
' ccc'
'aaa abbb'
我希望您能够翻译以下内容:
我想要计算每个字符串左侧和右侧的空格数量。
我正在处理以下问题。我有一个包含这种数据的列:
'abbb ccc '
' aaa abbb ccc'
'abbb ccc '
' aaa abbb ccc '
' ccc'
'aaa abbb'
我想要计算每个字符串左侧和右侧的空格数量。
LEN
、LTRIM
和REVERSE
的组合: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
进行计算。
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
你可以放弃使用 LEN
和 TRIM
函数,改用 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 |
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'
select datalength(N' ')
。当我运行此命令时,空格占用两个字节。 - Thorsten Kettner你可以这样做...
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