空格后的子字符串

Substring after a space

提问人:BRDroid 提问时间:6/21/2017 最后编辑:user513951BRDroid 更新时间:5/22/2020 访问量:67046

问:

我想拆分一个字符串并获取空格后的值。我可以在空格之前获取值,但如何在空格之后获取字符串。

DECLARE @string varchar(20) 
SELECT @string = 'Test Name'
SELECT SUBSTRING(@string, 0, CHARINDEX(' ', @string))

编辑:我正在使用 SQLServer 2012

sql-server sql-server-2012 子字符串

评论

0赞 Pred 6/21/2017
您是否总是有 2 个部分(1 个空格),或者您想在每次出现所选字符时拆分一个字符串?多空间呢?

答:

1赞 Steven Lemmens 6/21/2017 #1

不要使用子字符串,而是使用 .这将返回一个字符串数组。string_split

 SELECT value FROM STRING_SPLIT('Lorem ipsum dolor sit amet.', ' ');

这将返回以下数组:

Lorem
ipsum
dolor
sit
amet.

更多信息可以在这里找到: https://learn.microsoft.com/en-us/sql/t-sql/functions/string-split-transact-sql

评论

0赞 BRDroid 6/21/2017
感谢您的回复,但我使用的是 SQLServer 2012。我的错,我的问题中没有提到这一点。
21赞 Steve Ford 6/21/2017 #2

下面是引入 SQL Server 2016 之前使用 SQL SERVER 版本和用于 SQL SERVER 版本的版本。SUBSTRINGCHARINDEXSTRING_SPLIT

以下任一工作:

SELECT  SUBSTRING(@string, CHARINDEX(' ', @string) +1, 20)

SELECT  SUBSTRING(@string, CHARINDEX(' ', @string) +1, DATALENGTH(@string) - CHARINDEX(' ', @string) +1 )

根据 Rao 的评论进行编辑以添加描述

我们需要使用 CHARINDEX(返回一个表示字符串(空格)开始位置的数字)找到空间的位置。但是,我们要选择的字符串在空格之后开始,因此我们必须在 SUBSTRING 的起始位置添加 1 (+1),以便起始位置变为 CHARINDEX(' ', @string) + 1。

SUBSTRING 的第三个参数是要选择的字符串的长度,在第一种情况下,我只是假设您指定为 varchar(20) 的字符串不能超过 20 个字符,因此我使用 20。注意 SUBSTRING 不会尝试选择字符串末尾之后的字符,因此可以安全地指定比剩余字符数更长的长度。

我的第二个示例获取要选择的字符串的长度,因为它是总字符串的长度 (DATALENGTH) 减去我们选择前的字符数 (CHARINDEX + 1)

评论

0赞 BRDroid 6/21/2017
谢谢你完成了这项工作。如果你不介意,你能解释一下它是如何工作的吗?请在第一个查询和第二个查询中使用“+1”和 20。
0赞 BRDroid 6/21/2017
谢谢
3赞 Kristen 5/22/2020 #3

我发现

SELECT  SUBSTRING(@string, CHARINDEX(' ', @string) +1, DATALENGTH(@string) - CHARINDEX(' ', @string) +1 )

语法对于“从给定位置获取字符串的剩余部分”很详细,所以我改为“删除”部分 BEFORE 位置:

SELECT  STUFF(@string, 1, CHARINDEX(' ', @string), '')

STUFF ( character_expression , start , length , replaceWith_expression )

这两种方法的工作方式相同,包括 CHARINDEX 不匹配的地方