[英]SQL replace array field with corresponding values
我有2個SQL表,類似於下面的表:
table_a:
ID | Scenarios
1 1;2;3;4;
2 3;4
table_scenarios:
ID | Unit
1 A
2 B
3 C
4 D
我想要做的是制作一條SQL語句,該語句應將table_a字段場景中的值替換為table_scenarios中的相應值。輸出應如下所示:
ID | Scenarios
1 A;B;C;D;
2 C;D;
不使用VBA編碼如何實現?
免責聲明:正如評論正確指出的那樣,這遠不是一種優化的數據結構方式。 嚴格地,您應該重組表,但是如果您被限制以這種方式進行操作,則可以進行以下工作。
使用字符串拆分表值函數(從SQL Server Central復制)
CREATE FUNCTION [dbo].[fnSplitString]
(
@string NVARCHAR(MAX),
@delimiter CHAR(1)
)
RETURNS @output TABLE(splitdata NVARCHAR(MAX)
)
BEGIN
DECLARE @start INT, @end INT
SELECT @start = 1, @end = CHARINDEX(@delimiter, @string)
WHILE @start < LEN(@string) + 1 BEGIN
IF @end = 0
SET @end = LEN(@string) + 1
INSERT INTO @output (splitdata)
VALUES(SUBSTRING(@string, @start, @end - @start))
SET @start = @end + 1
SET @end = CHARINDEX(@delimiter, @string, @start)
END
RETURN
END
使用以下查詢后,您可以獲得所需的結果:
;
WITH CTE_Units
AS (
SELECT ta.ID,
ts.Unit
FROM #table_a AS ta
CROSS APPLY dbo.fnSplitString(ta.Scenarios, ';') split
INNER JOIN #table_scenarios AS ts ON split.splitdata = ts.ID
)
SELECT units.ID,
STUFF((
SELECT ';' + CTE_Units.Unit
FROM CTE_Units
WHERE CTE_Units.ID = units.ID
FOR
XML PATH('')
), 1, 1, '') + ';' AS Scenarios
FROM CTE_Units units
GROUP BY units.ID;
結果:
在XML和CTE的幫助下:
DECLARE @xml xml
SELECT @xml = (
SELECT CAST('<i id="'+CAST(ID as nvarchar(max)) + '"><s>' + REPLACE(Scenarios,';','</s><s>') + '</s></i>' as xml)
FROM table_a
FOR XML PATH(''))
;WITH final AS (
SELECT t.v.value('../@id','int') as Id,
ts.Unit
FROM @xml.nodes('/i/s') as t(v)
INNER JOIN table_scenarios ts
ON ts.ID = t.v.value('.','nvarchar(10)')
)
SELECT DISTINCT id,
(SELECT Unit +';'
FROM final f1
WHERE f.Id = f1.Id
FOR XML PATH('')
) as Scenarios
FROM final f
輸出:
id Scenarios
1 A;B;C;D;
2 C;D;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.