首頁 > 資料庫 > mysql教程 > 如何在 SQL 中連接逗號分隔的資料列?

如何在 SQL 中連接逗號分隔的資料列?

Mary-Kate Olsen
發布: 2024-12-29 01:07:10
原創
454 人瀏覽過

How to Join Comma-Delimited Data Columns in SQL?

加入逗號分隔的資料列

挑戰:

給定兩個表,其中一個包含逗號分隔的資料列,任務是從表中檢索資料並用逗號分隔顯示結果每行的值連接成一個字串。

解決方案:

標準化:

理想的方法是使用逗號分隔的資料列,消除了複雜的字串操作的需要。透過建立一個新表,其中每個逗號分隔值成為一個新行,然後您可以輕鬆地在公共欄位上連接表。

分割函數:

如果規範化是不可能的,可以建立一個分割函數來將逗號分隔的值轉換為可以連接的行。然後,可以使用此函數將資料保留在多行中,或將值連接回逗號分隔的清單中。

對於 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;
登入後複製
分割函數:

對於XML路徑和STUFF:透過選擇適當的方法並實現必要的程式碼,您可以有效地將逗號分隔的資料連接到表中每一行的單一字串中。

以上是如何在 SQL 中連接逗號分隔的資料列?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板