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

时间:2018-05-24 14:43:36

标签: sql sql-server string tsql

我正在努力解决以下问题。我有一个包含此类数据的专栏:

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

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

5 个答案:

答案 0 :(得分:6)

尝试使用LENLTRIMREVERSE的组合:

SELECT
    LEN(col) - LEN(LTRIM(col)) AS num_left,
    LEN(REVERSE(col)) - LEN(LTRIM(REVERSE(col))) AS num_right
FROM yourTable;

Demo

正如@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)

您可以抛弃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

答案 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