我正在努力解决以下问题。我有一个包含此类数据的专栏:
'abbb ccc '
' aaa abbb ccc'
'abbb ccc '
' aaa abbb ccc '
' ccc'
'aaa abbb'
我想计算左边的空格数和每个字符串右边的空格数。
答案 0 :(得分:6)
尝试使用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
进行计算。
答案 1 :(得分: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
答案 2 :(得分:2)
您可以抛弃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 |
答案 3 :(得分:1)
使用datalength获取全长
len将rtrim
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'
答案 4 :(得分: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