С помощью T SQL получить правую часть строки, начиная с 60-го символа, но не разбивая слово - PullRequest
0 голосов
/ 13 июля 2020

Я пытаюсь разбить длинные строки (> 60 символов) на две части, но сохраняя целостность слова, содержащего 60-й символ.

Например, для строки one two three four five six seven eight nine ten eleven twelve thirteen fourteen буква l в слове twelve является 60-м символом, поэтому я хотел бы разбить строку на

one two three four five six seven eight nine ten eleven

и

twelve thirteen fourteen

Пока что, сосредоточившись только на получении нужной части строки, я могу использовать REVERSE(), чтобы получить все последнее слово

DECLARE @Input varchar(100)
SET @Input = 'one two three four five six seven eight nine ten eleven twelve thirteen fourteen'

SELECT LTRIM(RTRIM(RIGHT(@Input, CHARINDEX(' ', REVERSE(@Input)) - 1))) AS LastWholeWord
    ,  @Input           AS UnalteredString
    ,  LEN(@Input)      AS LengthOfString
    ,  LEFT(@Input, 60) AS First60

Теперь я думал, что могу просто ограничьте последний REVERSE() первыми 60 символами, вставив LEFT(@Input, 60), как таковой LTRIM(RTRIM(RIGHT(@Input, CHARINDEX(' ', REVERSE(LEFT(@Input, 60))) - 1)))

, но это, похоже, не дает желаемого результата. Я был бы рад, если бы кто-нибудь мог указать мне правильное направление !!

Спасибо за ваше время!

Ответы [ 2 ]

2 голосов
/ 13 июля 2020

Это должно сработать:

DECLARE @divingSpaceChar INT =
LEN(SUBSTRING(@Input,0, 60)) - CHARINDEX(' ', REVERSE(SUBSTRING(@Input,0, 60))) + 1

SELECT SUBSTRING(@Input, 0, @divingSpaceChar) AS leftString
SELECT LTRIM(SUBSTRING(@Input,  @divingSpaceChar, LEN(@input))) AS rightString

Получить индекс последнего символа пробела в первых 60 символах подстроки. Получить подстроку из этого последнего charindex ...

Без дополнительных переменных вы можете:

SELECT
RTRIM(LTRIM(SUBSTRING(@Input, LEN(SUBSTRING(@Input,0, 60)) 
- CHARINDEX(' ', REVERSE(SUBSTRING(@Input,0, 60)))+ 1, LEN(@input)))) AS RightPart,
RTRIM(LTRIM(SUBSTRING(@Input, 0, LEN(SUBSTRING(@Input,0, 60))
- CHARINDEX(' ', REVERSE(SUBSTRING(@Input,0, 60)))+ 1))) AS LeftPart
0 голосов
/ 14 июля 2020

Что насчет использования регулярного выражения, выглядит намного чище ..

(Я покажу синтаксис с помощью Presto, но я предполагаю, что он очень похож на другие SQL)

Регулярное выражение: '(.{1,60})(?= )(.*)'. Примечание в запросе: $ 1, $ 2 для отображения каждой части строки ..

SELECT regexp_replace('one two three four five six seven eight nine ten eleven twelve thirteen fourteen',
                  '(.{1,60})(?= )(.*)', '$1') part1,
       regexp_replace('one two three four five six seven eight nine ten eleven twelve thirteen fourteen',
                  '(.{1,60})(?= )(.*)', '$2') part2


-----
Results
part1                                                    part2
one two three four five six seven eight nine ten eleven  twelve thirteen fourteen
...