我有一个字符串,想要得到这个字符串的前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 78789
是123 4056 78789 abcdefg
,这是不正确的,应该仍然是@length = 22
谢谢!
修改
只是为了澄清我的问题:
从@length = 32
到123 4056 78789 abcdefg
我应该{{1}}
答案 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设置为什么)。