如何在SQL Query中从逗号分隔的字符串中选择值?

时间:2017-11-10 09:09:00

标签: sql sql-server vb.net

我想从SQL查询中用逗号(,)分隔的字符串中选择值, 我尝试使用以下查询,但它只提供3列 我想要8列

SELECT 
  LEFT(DB_field, CHARINDEX(',', DB_field)-1) as '1st column', 
  SUBSTRING(DB_field, CHARINDEX(',', DB_field)+1, LEN(DB_field)-CHARINDEX(',', DB_field)-CHARINDEX(',',REVERSE(DB_field)))  as '2nd column',
  RIGHT(DB_field, CHARINDEX(',', REVERSE(DB_field))-1)   as '3rd column'
FROM Table_Name

DB_field 有字符串值,但用逗号(,)分隔 123,456,789,abcd,efghjk,lmno,pqrs,tuvw 如何在SQL Query中从该字符串中选择该值?

请有人帮助我

2 个答案:

答案 0 :(得分:1)

基于XML的解决方案:

;WITH cte AS (
    SELECT *
    FROM (VALUES
    (N'123,456,789,abcd,efghjk,lmno,pqrs,tuvw'),
    (N'987,654,321,dbca,kjhgfe,onml,srqp,xyz')
    ) as t(DB_field)
)

SELECT  t.c.value('/a[1]','nvarchar(max)') as [1column],
        t.c.value('/a[2]','nvarchar(max)') as [2column],
        t.c.value('/a[3]','nvarchar(max)') as [3column],
        t.c.value('/a[4]','nvarchar(max)') as [4column],
        t.c.value('/a[5]','nvarchar(max)') as [5column],
        t.c.value('/a[6]','nvarchar(max)') as [6column],
        t.c.value('/a[7]','nvarchar(max)') as [7column],
        t.c.value('/a[8]','nvarchar(max)') as [8column],
        t.c.value('/a[9]','nvarchar(max)') as [9column]
FROM (
    SELECT CAST(('<a>'+REPLACE(DB_field,',','</a><a>') +'</a>') as xml) as x
    FROM cte c
) as xt
CROSS APPLY xt.x.nodes('/') as t(c)

输出:

1column 2column 3column 4column 5column 6column 7column 8column 9column
123     456     789     abcd    efghjk  lmno    pqrs    tuvw    NULL
987     654     321     dbca    kjhgfe  onml    srqp    xyz     NULL

答案 1 :(得分:0)

如果您使用 SQL Server 2014或更低版本,请创建自定义功能。

CREATE FUNCTION SplitString
(    
      @Input NVARCHAR(MAX),
      @Character CHAR(1)
)
RETURNS @Output TABLE (
      Item NVARCHAR(1000)
)
AS
BEGIN
      DECLARE @StartIndex INT, @EndIndex INT

      SET @StartIndex = 1
      IF SUBSTRING(@Input, LEN(@Input) - 1, LEN(@Input)) <> @Character
      BEGIN
            SET @Input = @Input + @Character
      END

      WHILE CHARINDEX(@Character, @Input) > 0
      BEGIN
            SET @EndIndex = CHARINDEX(@Character, @Input)

            INSERT INTO @Output(Item)
            SELECT SUBSTRING(@Input, @StartIndex, @EndIndex - 1)

            SET @Input = SUBSTRING(@Input, @EndIndex + 1, LEN(@Input))
      END

      RETURN
END
GO

并在您的选择查询中使用上述功能。

SELECT Item
FROM dbo.SplitString('Apple,Mango,Banana,Guava')

You can refer this for more info

如果您使用 SQL Server 2016 ,则可以使用STRING_SPLIT

SELECT value  
FROM STRING_SPLIT('clothing,road,,touring,bike', ',')  
WHERE RTRIM(value) <> '';