如何在SQL查询中从逗号分隔的字符串中选择值?
我想从SQL查询中以逗号(,)分隔的字符串中选择值, 我尝试了以下查询,但它只给出了3列 我想要8列如何在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 '
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