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

时间:2015-01-14 03:33:45

标签: sql sql-server string tsql sql-server-2008-r2

我有一个字符串,想要得到这个字符串的前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 = 22 123 4056 78789123 4056 78789 abcdefg,这是不正确的,应该仍然是@length = 22

谢谢!

修改

只是为了澄清我的问题:

@length = 32123 4056 78789 abcdefg我应该{{1}}

5 个答案:

答案 0 :(得分:3)

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

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;

答案 1 :(得分:1)

我想我理解你的要求。

你需要做的是找到长度之后的第一个空格,然后返回所有字符直到那一点。

试试这个:

SELECT LEFT(@text + ' ',CHARINDEX(' ',@text,@length))

答案 2 :(得分:1)

select left(@text, case when charindex(' ', @text, @length) = 0 
                        then LEN(@text) 
                        else charindex(' ', @text, @length) - 1 
                   end)

答案 3 :(得分:0)

更新了长度。

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)))

答案 4 :(得分:-1)

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设置为什么)。