使用 TSQL,获取从第 60 个字符开始的字符串的正确部分,但不分解单词

With TSQL, Get right part of a string starting 60th character, but not breaking up the word

我正在尝试将长字符串(> 60 个字符)分成两部分,但要保持第 60 个字符的单词的完整性。

例如对于字符串one two three four five six seven eight nine ten eleven twelve thirteen fourteen,单词twelve中的字母l是第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

现在,我的想法是,我可以通过放入 LEFT(@Input, 60) 将最后 REVERSE() 限制为前 60 个字符,因此 LTRIM(RTRIM(RIGHT(@Input, CHARINDEX(' ', REVERSE(LEFT(@Input, 60))) - 1)))

但这似乎没有达到预期的效果。如果有人能指出正确的方向,我会很高兴!!

感谢您的宝贵时间!

这应该有效:

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 个字符中最后 space 个字符的索引。 从最后一个字符索引中获取子字符串...

没有额外的变量,你可以这样做:

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

用正则表达式怎么样,看起来干净多了..

(我将使用 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})(?= )(.*)', '') part1,
       regexp_replace('one two three four five six seven eight nine ten eleven twelve thirteen fourteen',
                  '(.{1,60})(?= )(.*)', '') part2


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