在SQL Server中,我想将字符串与'〜'分开

时间:2013-10-18 16:50:36

标签: sql sql-server

我有问题。我的表中有A~B~C~D个值。

我希望将此字符串分开,例如“A”和“B~C”。

我可以使用此功能分离'A'

SELECT SUBSTRING(Item.Description, 0, CHARINDEX('~', Item.Description)) As Com

但在那之后,我无法分开'B~C'。

当然,如果我经常使用SUBSTRINGCHARINDEX,我可以分开。

但这很复杂。

所以我想知道我是否可以使用其他方式。

非常适合阅读

2 个答案:

答案 0 :(得分:5)

这是一个简短的SQL函数,您可以创建它来分割字符串:

CREATE FUNCTION dbo.Split (@sep char(1), @s varchar(8000))
RETURNS table
AS
RETURN (
    WITH splitter_cte AS (
      SELECT CHARINDEX(@sep, @s) as pos, 0 as lastPos
      UNION ALL
      SELECT CHARINDEX(@sep, @s, pos + 1), pos
      FROM splitter_cte
      WHERE pos > 0
    )
    SELECT SUBSTRING(@s, lastPos + 1,
                     case when pos = 0 then 80000
                     else pos - lastPos -1 end) as chunk
    FROM splitter_cte
  )
GO

以下是您将如何使用它:

SELECT * FROM dbo.Split('~', 'A~B~C~D')

输出:

chunk
-------------
A
B
C
D

详细了解sql split function如何运作

答案 1 :(得分:1)

此解决方案基于XML:

DECLARE @Source VARCHAR(4000);
SET @Source = 'A~B~C~D';

DECLARE @x XML;
SET @x = CONVERT(XML, '<item>' + REPLACE(@Source, '~', '</item> <item>') + '</item>');
-- result @x = <item>A</item><item>B</item><item>C</item><item>D</item>

SELECT  a.b.value('.', 'NVARCHAR(100)') AS Value
FROM    @x.nodes('/item') a(b);

结果:

Value
-----
A
B
C
D