如何获取字符串的前 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 = 22
是 123 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)))
我有一个字符串,想获取该字符串的前 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
我想我明白你的要求了。
您需要做的是找到长度后的第一个 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)))