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

Posted

技术标签:

【中文标题】使用 SQL,获取从第 60 个字符开始的字符串的正确部分,但不分解单词【英文标题】:With TSQL, Get right part of a string starting 60th character, but not breaking up the word 【发布时间】:2020-11-03 02:47:20 【问题描述】:

我试图将长字符串(> 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)))

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

感谢您的宝贵时间!

【问题讨论】:

【参考方案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 个字符中最后一个空格字符的索引。 从最后一个 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

【讨论】:

这确实回答了我的问题——谢谢!但是,我使用了您响应的第一次迭代,因为我实际上不会在代码中使用变量。你能编辑你的答案以包括RTRIM(LTRIM(SUBSTRING(@Input, LEN(SUBSTRING(@Input,0, 60)) - CHARINDEX(' ', REVERSE(SUBSTRING(@Input,0, 60)))+ 1, LEN(@input)))) AS RightPartRTRIM(LTRIM(SUBSTRING(@Input, 0, LEN(SUBSTRING(@Input,0, 60)) - CHARINDEX(' ', REVERSE(SUBSTRING(@Input,0, 60)))+ 1))) AS LeftPart 是的,为了清楚起见,把它放在那里【参考方案2】:

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

(我将展示使用 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

【讨论】:

有趣。我可能只是为了好玩而玩弄它。只是为了后代,第2部分的答案需要是“十二十三十四”,而第1部分不应该有“十二”

以上是关于使用 SQL,获取从第 60 个字符开始的字符串的正确部分,但不分解单词的主要内容,如果未能解决你的问题,请参考以下文章

MID(s,n,len)

SqlServer 获取字符串中小写字母的sql语句

Excel中如何提取某个单元格从第N个字符开始的内容?

SQL:substring用法

有一字符串,包含n个字符。写一函数,将此字符串中从第m个字符开始的全部字符复制成为另一个字符串

SQL中字符串截取函数(SUBSTRING)