Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Menyertai Lajur Data Terhad Koma dalam SQL?

Bagaimana untuk Menyertai Lajur Data Terhad Koma dalam SQL?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-29 01:07:10499semak imbas

How to Join Comma-Delimited Data Columns in SQL?

Menyertai Lajur Data Terhad Koma

Cabaran:

Diberi dua jadual, satu dengan data dipisahkan koma lajur, tugasnya adalah untuk mendapatkan semula data daripada jadual dan membentangkan keputusan dengan dipisahkan koma nilai yang dicantumkan ke dalam rentetan tunggal untuk setiap baris.

Penyelesaian:

Penormalan:

Pendekatan yang ideal ialah menormalkan jadual dengan lajur data yang dipisahkan koma, menghapuskan keperluan untuk manipulasi rentetan yang kompleks. Dengan mencipta jadual baharu di mana setiap nilai yang dipisahkan koma menjadi baris baharu, anda kemudiannya boleh menyertai jadual pada medan biasa dengan mudah.

Fungsi Pisah:

Jika normalisasi tidak mungkin, fungsi split boleh dibuat untuk menukar nilai yang dipisahkan koma kepada baris yang boleh dicantumkan. Fungsi ini kemudiannya boleh digunakan untuk sama ada meninggalkan data dalam berbilang baris atau menggabungkan nilai kembali ke dalam senarai yang dipisahkan koma.

UNTUK LALUAN dan STUFF XML:

Sebagai alternatif, anda boleh menggunakan teknik FOR XML PATH dan STUFF untuk mendapatkan semula data. FOR XML PATH akan menukar nilai yang dipisahkan koma kepada XML dan STUFF boleh digunakan untuk menggabungkan XML menjadi satu rentetan.

Aplikasi Direct FOR XML PATH:

Pendekatan terakhir ialah memohon FOR XML PATH terus ke lajur data. Dengan memilih lajur yang dikehendaki dan menggunakan pertanyaan yang sesuai, anda boleh mendapatkan semula nilai yang dipisahkan koma dan mengagregatkannya ke dalam satu rentetan.

Butiran Pelaksanaan:

Bergantung pada pendekatan yang dipilih, pelaksanaan akan berbeza-beza. Contoh berikut memberikan gambaran ringkas tentang cara setiap kaedah boleh dilaksanakan:

Penormalan:

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, '');

Fungsi Pisah:

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, '');

UNTUK LALUAN XML dan STUFF:

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;

Dengan memilih pendekatan yang sesuai dan melaksanakan kod yang diperlukan, anda boleh menggabungkan data yang dipisahkan koma dengan berkesan ke dalam rentetan tunggal untuk setiap baris dalam jadual.

Atas ialah kandungan terperinci Bagaimana untuk Menyertai Lajur Data Terhad Koma dalam SQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn