我有一个包含ID
和Value
的表格,其中Value
字段是以空格分隔的值列表:
ID Value
100 A1 A2 A3
200 B1
300 C1 C2
我想拆分值字符串,并将每个字符串作为一个具有ID的单独行:
ID Value
100 A1
100 A2
100 A3
200 B1
300 C1
300 C2
如何在T-SQL中执行此操作?
答案 0 :(得分:4)
您可以使用自定义Split
功能和CROSS APPLY
:
SELECT ID, Split.Item As Value
FROM dbo.TableName
CROSS APPLY dbo.Split(Value, ' ')as Split
但最好规范化您的数据库并使用单独的表将ID与值链接。
我使用了这个表值函数:
CREATE FUNCTION [dbo].[Split]
(
@ItemList NVARCHAR(MAX),
@delimiter CHAR(1)
)
RETURNS @ItemTable TABLE (Item VARCHAR(250))
AS
BEGIN
DECLARE @tempItemList NVARCHAR(MAX)
SET @tempItemList = @ItemList
DECLARE @i INT
DECLARE @Item NVARCHAR(4000)
--SET @tempItemList = REPLACE (@tempItemList, ' ', '')
SET @i = CHARINDEX(@delimiter, @tempItemList)
WHILE (LEN(@tempItemList) > 0)
BEGIN
IF @i = 0
SET @Item = @tempItemList
ELSE
SET @Item = LEFT(@tempItemList, @i - 1)
INSERT INTO @ItemTable(Item) VALUES(@Item)
IF @i = 0
SET @tempItemList = ''
ELSE
SET @tempItemList = RIGHT(@tempItemList, LEN(@tempItemList) - @i)
SET @i = CHARINDEX(@delimiter, @tempItemList)
END
RETURN
END
答案 1 :(得分:1)
SQL Server 2016及更高版本具有STRING_SPLIT()函数,可根据指定的分隔符将字符串拆分为一行子字符串。因此,对于您的问题,您只需执行以下操作即可:
SELECT ID,s.value FROM dbo.TableName t
outer apply STRING_SPLIT(t.Value, ' ') s
答案 2 :(得分:0)
请尝试:
SELECT
ID,
Split.a.value('.', 'VARCHAR(100)') AS [Value]
FROM
(
SELECT
ID,
CAST ('<M>' + REPLACE(Value, ' ', '</M><M>') + '</M>' AS XML) AS CVS
FROM YourTable
) AS A CROSS APPLY CVS.nodes ('/M') AS Split(a)