Подсчет пробелов (код ASCII 32) в начале и конце строки - PullRequest
0 голосов
/ 24 мая 2018

Я борюсь со следующей проблемой.У меня есть столбец с данными такого типа:

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

Я хочу посчитать количество пробелов слева и количество пробелов справа от каждой строки.

Ответы [ 5 ]

0 голосов
/ 24 мая 2018

Вы можете отказаться от функций 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               |

SQL Fiddle

0 голосов
/ 24 мая 2018

Вы можете сделать это ...

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

0 голосов
/ 24 мая 2018
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
0 голосов
/ 24 мая 2018

Используйте длину данных, чтобы получить полную длину
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'
0 голосов
/ 24 мая 2018

Попробуйте использовать комбинацию LEN, LTRIM и REVERSE:

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

Демо

As@AaronDietz, упомянутый в комментарии ниже, LEN на самом деле также обрезает пробелы справа.Но LEN не влияет на начальные пробелы.Чтобы компенсировать это, мы можем перевернуть строку и затем выполнить вычисления, используя LTRIM.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...