如何在SQL中将字符串拆分为变量?

10
我有一个字符串,它看起来像这样BAT | CAT | RAT | MAT。我想将这个字符串分成四个部分,然后分别存储到四个不同的变量中,比如说@a,@b,@c和@d。
在SQL中该怎么做?

使用CHARINDEX,请参考这里:https://dev59.com/d2kv5IYBdhLWcg3wdQnm - T McKeown
这个与编程有关的内容是:这个链接是否有帮助,https://dev59.com/GnVD5IYBdhLWcg3wXacd - KumarHarsh
作为你所面临的问题,这个线程可能会对你有所帮助:http://stackoverflow.com/questions/6953115/dividing-a-string-into-two-parts-and-selecting-into-two-variables - Fu March
3个回答

14

用于以字符分割:

DECLARE @A VARCHAR (100)= 'cat | bat | sat'

SELECT items
INTO #STRINGS 
FROM dbo.split(@A,'|')

另请参阅此链接。

DECLARE @test varchar(max);
set @test = 'Peter/Parker/Spiderman/Marvel';
set @test = Replace(@test, '/', '.');

SELECT ParseName(@test, 4) --returns Peter
SELECT ParseName(@test, 3) --returns Parker
SELECT ParseName(@test, 2) --returns Spiderman
SELECT ParseName(@test, 1) --returns Marvel

SQL Server 2005 :如何将字符串拆分成数组并获取数组(x)?

字符串拆分的解决方法:

http://www.sqlperformance.com/2012/07/t-sql-queries/split-strings


ParseName是标准的聪明答案,但实际上并不是一个非常好的答案,因为它期望sysname数据类型。只需进行普通的字符串分割即可。 - ErikE
@ErikE,您能否详细说明为什么应该避免使用ParseName,因为这对我来说似乎是非常诱人的代码片段。 - SamuraiJack
好的,我刚刚意识到只能拆分4个参数,如果有第5个参数,它将返回null。我错了吗? - SamuraiJack
实际上,您是正确的,请访问链接以获取更多信息。 - gaurav5430
如果你想使用句点怎么办?如果你想要超过255个字符的字符串怎么办?你看过ParseName的代码吗?如果我没记错的话,它非常丑陋。滥用系统函数让我感到不安。这似乎是一个坏主意。如果你只有3个标记而不是4个,并且要求第4个呢? - ErikE

9

简单明了。(在Microsoft SQL Server Management Studio中使用PATINDEX函数。)

DECLARE @string varchar(25) = 'BAT | CAT | RAT | MAT'
DECLARE @one varchar(5) = null
DECLARE @two varchar(5) = null
DECLARE @three varchar(5) = null
DECLARE @four varchar(5) = null

BEGIN

      SET @one = SUBSTRING(@string, 0, PATINDEX('%|%', @string)) 
      SET @string = SUBSTRING(@string, LEN(@one + '|') + 1, LEN(@string))

      SET @two = SUBSTRING(@string, 0, PATINDEX('%|%', @string))
      SET @string = SUBSTRING(@string, LEN(@two + '|') + 1, LEN(@string))

      SET @three = SUBSTRING(@string, 0, PATINDEX('%|%', @string))
      SET @string = SUBSTRING(@string, LEN(@three + '|') + 1, LEN(@string))

      SET @four = @string

      SELECT @one AS Part_One, @two AS Part_Two, @three AS Part_Three, @four AS Part_Four
END 

7
您可以将这些值分割并插入到表变量中,然后将它们赋值给您的变量,如下所示:
DECLARE @DataSource TABLE
(
    [ID] TINYINT IDENTITY(1,1)
   ,[Value] NVARCHAR(128)
)   

DECLARE @Value NVARCHAR(MAX) = 'BAT | CAT | RAT | MAT'

DECLARE @XML xml = N'<r><![CDATA[' + REPLACE(@Value, '|', ']]></r><r><![CDATA[') + ']]></r>'

INSERT INTO @DataSource ([Value])
SELECT RTRIM(LTRIM(T.c.value('.', 'NVARCHAR(128)')))
FROM @xml.nodes('//r') T(c)

SELECT [ID] 
      ,[Value]
FROM @DataSource

这个查询的结果是: enter image description here 请注意,这种技术是动态的 - 它会将任意数量用|分隔的字符串拆分并存储在表变量中。

有没有更简单的方法?我有一个函数负责拆分长字符串参数,但当参数数量已知时,我正在寻找一些简单的方法来拆分字符串。 - SamuraiJack
这是一种众所周知的字符串分割技术,非常简单。如果您有一个实现此方法的函数,您可以在任何需要的地方使用它。 - gotqn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接