Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在SQL查询中从逗号分隔的字符串中选择值?_Sql_Sql Server_Vb.net - Fatal编程技术网

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

如何在SQL查询中从逗号分隔的字符串中选择值?,sql,sql-server,vb.net,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 '

我想从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_字段具有字符串值,但以逗号(,)分隔,类似于123456789、abcd、efghjk、lmno、pqrs、tuvw 如何在SQL查询中从该字符串中选择该值


如果您使用的是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

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

选择值
来自STRING_SPLIT(‘服装、道路、旅游、自行车’、’、’)
其中RTRIM(值)';
基于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)

这个问题可能重复的问题以前已经被问过很多很多次了。请使用你最喜欢的搜索引擎。
SELECT value  
FROM STRING_SPLIT('clothing,road,,touring,bike', ',')  
WHERE RTRIM(value) <> '';  
;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