如何获取字符串的前 n 个字符但以整个单词结尾

How to get the first n characters of a string but ending with a whole word

我有一个字符串,想获取该字符串的前 n 个字符,但以一个完整的单词结尾。

DECLARE @text VARCHAR(MAX) = '123 4056 78789 abcdefg 2222222222 3333 444 55555'
        ,@length INT = 23

到目前为止我已经写了这个查询:

REVERSE(STUFF(REVERSE(LEFT(@text, @length)), 1, CHARINDEX(' ',REVERSE(LEFT(@text, @length))),''))

@length = 23 的输出是 123 4056 78789 abcdefg

但是 @length = 22123 4056 78789 这是不正确的,应该仍然是 123 4056 78789 abcdefg

谢谢!

编辑

澄清一下我的问题:

@length = 22@length = 32我应该得到123 4056 78789 abcdefg

我想我明白你的要求了。

您需要做的是找到长度后的第一个 space,然后 return 直到那个点的所有字符。

试试这个:

SELECT LEFT(@text + ' ',CHARINDEX(' ',@text,@length))
select left(@text, case when charindex(' ', @text, @length) = 0 
                        then LEN(@text) 
                        else charindex(' ', @text, @length) - 1 
                   end)
DECLARE @text VARCHAR(MAX) = '123 4056 78789 abcdefg 2222222222 3333 444 55555'
        ,@length INT = 23

SELECT SUBSTRING(REPLACE(RTRIM(LTRIM(@text)),' ',''),1,@length) AS [Text Output]

我加入了 RTRIM()LTRIM() 以删除字符串前后的所有空格。然后替换字符串中的所有空格。最后得到长度的子串(无论@length设置成什么)。

如果我对您的要求理解正确,我认为您需要以下内容:

WITH x AS (
    SELECT '123 4056 78789 abcdefg 2222222222 3333 444 55555' AS [text], 22 AS [length]
)
SELECT LEFT([text], LEN([text]) - CHARINDEX(' ', REVERSE([text]), LEN([text]) - [length]))
  FROM x;

(我将所有内容都放在 WITH 子句中,这样我就可以引用列名而不是插入您的值。)

Please see SQL Fiddle demo here。我用 22 和 32 的长度值测试了它。

更新 根据以下评论:

WITH x AS (
    SELECT '123 4056 78789 abcdefg 2222222222 3333 444 55555' AS [text], 22 AS [length]
)
SELECT LEFT([text], LEN([text]) - CHARINDEX(' ', REVERSE([text]) + ' ', LEN([text]) - [length]) + 1)
  FROM x;

更新了长度。

DECLARE @str VARCHAR(200)='123 4056 78789 abcdefg 2222222222 3333 444 55555',
        @len INT=22
SET @str=Reverse(Substring(@str, 1, @len))
SELECT Reverse(Substring(@str, Patindex('%[a-z]%', @str), @len)) 

没有长度

DECLARE @str VARCHAR(200)='123 4056 78789 abcdefg 2222222222 3333 444 55555'
set @str=REVERSE(@str)
SELECT reverse(Substring(@str, 
             Patindex('%[a-z]%',@str), 
             Charindex(' ', @str, Patindex('%[a-z]%',@str) )-Patindex('%[a-z]%',@str)))