空格后的子串

时间:2017-06-21 08:34:29

标签: sql-server string sql-server-2012 substring

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

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

编辑:我正在使用SQLServer 2012

3 个答案:

答案 0 :(得分:7)

这是使用SUBSTRINGCHARINDEX的版本,用于在引入STRING_SPLIT时SQL Server 2016之前的SQL SERVER版本。

以下任何一种作品:

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

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

根据Rao的评论编辑添加说明

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

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

我的第二个例子根据总字符串的长度(DATALENGTH)减去我们选择前的字符数(CHARINDEX + 1)来获取要选择的字符串的长度

答案 1 :(得分:1)

我找到了

Sub test()
Dim MyArr() As String
Dim ArrItem As String
Dim z As String
Dim x As String
x = "a,b,c,d,e,f,g"
MyArr = Split(x, ",")
For i = 2 To UBound(MyArr)
    ArrItem = MyArr(i)
Next i
z = Join(ArrItem, "/")
MsgBox z
End Sub

“从给定位置获取字符串的其余部分”的语法很冗长,因此我改为“删除”位置之前的部分:

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

STUFF(character_expression,start,length,replaceWith_expression)

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

答案 2 :(得分:0)

不要使用子字符串,但请使用string_split。这将返回一个字符串数组。

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

返回以下数组:

Lorem
ipsum
dolor
sit
amet.

可在此处找到更多信息:https://docs.microsoft.com/en-us/sql/t-sql/functions/string-split-transact-sql