挑戰:
給定兩個表,其中一個包含逗號分隔的資料列,任務是從表中檢索資料並用逗號分隔顯示結果每行的值連接成一個字串。
標準化:
理想的方法是使用逗號分隔的資料列,消除了複雜的字串操作的需要。透過建立一個新表,其中每個逗號分隔值成為一個新行,然後您可以輕鬆地在公共欄位上連接表。
分割函數:
如果規範化是不可能的,可以建立一個分割函數來將逗號分隔的值轉換為可以連接的行。然後,可以使用此函數將資料保留在多行中,或將值連接回逗號分隔的清單中。
對於 XML PATH 和 STUFF:
或者,您可以使用 FOR XML PATH 和 STUFF 技術來擷取資料。 FOR XML PATH 會將逗號分隔的值轉換為 XML,並且可以使用 STUFF 將 XML 連接成單一字串。
直接 FOR XML PATH 應用:
最後一種方法是將 FOR XML PATH 直接套用於資料列。透過選擇所需的列並使用適當的查詢,您可以檢索以逗號分隔的值並將它們聚合為單一字串。
根據所選的方法,實作會有所不同。以下範例簡要概述如何實現每種方法:
標準化:
CREATE TABLE NormalizedTable ( id INT, value VARCHAR(255), ); INSERT INTO NormalizedTable (id, value) VALUES (1, 'john'), (2, 'alex'), (3, 'piers'), (4, 'sara'), (5, 'C1'), (6, 'C2'), (7, 'C3'), (8, 'C4'), (9, 'R1'), (10, 'R2'), (11, 'R3'); SELECT DISTINCT T2.col1, STUFF(( SELECT ', ' + T1.col2 FROM NormalizedTable T1 INNER JOIN Table2 T2 ON T1.id = T2.col2 FOR XML PATH('') ), 1, 2, '');
分割函數:
CREATE FUNCTION dbo.Split (@String VARCHAR(MAX), @Delimiter CHAR(1)) RETURNS TABLE AS RETURN WITH CTE AS ( SELECT 1 AS RowNum, @String AS Value UNION ALL SELECT RowNum + 1, SUBSTRING(@String, RowNum + 1, LEN(@Delimiter)) FROM CTE WHERE SUBSTRING(@String, RowNum + 1, LEN(@Delimiter)) <> '' ) SELECT RowNum, Value AS Item FROM CTE; -- Usage SELECT DISTINCT T2.col1, STUFF(( SELECT ', ' + T1.col2 FROM ( SELECT DISTINCT Value AS col2 FROM dbo.Split(T2.col2, ',') ) T1 FOR XML PATH('') ), 1, 2, '');
分割函數:
SELECT T2.col1, ( SELECT ', ' + T1.col2 FROM Table1 T1 WHERE ',' + T2.col2 + ',' LIKE '%,' + CAST(T1.col1 AS VARCHAR(10)) + ',%' FOR XML PATH('') ).value('substring(text()[1], 3)', 'VARCHAR(MAX)') AS col2 FROM Table2 T2;
以上是如何在 SQL 中連接逗號分隔的資料列?的詳細內容。更多資訊請關注PHP中文網其他相關文章!