Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Tách các giá trị được phân tách trong một cột SQL thành nhiều hàng

Nếu bạn đang sử dụng SQL Server 2016+

Bạn có thể sử dụng STRING_SPLIT mới chức năng mà tôi đã viết blog ở đây và Brent Ozar đã viết blog về đây.

SELECT s.[message-id], f.value
  FROM dbo.SourceData AS s
  CROSS APPLY STRING_SPLIT(s.[recipient-address], ';') as f;

Nếu bạn vẫn đang sử dụng phiên bản trước SQL Server 2016

Tạo một hàm chia nhỏ. Đây chỉ là một trong nhiều ví dụ:

CREATE FUNCTION dbo.SplitStrings
(
    @List       NVARCHAR(MAX),
    @Delimiter  NVARCHAR(255)
)
RETURNS TABLE
AS
    RETURN (SELECT Number = ROW_NUMBER() OVER (ORDER BY Number),
        Item FROM (SELECT Number, Item = LTRIM(RTRIM(SUBSTRING(@List, Number, 
        CHARINDEX(@Delimiter, @List + @Delimiter, Number) - Number)))
    FROM (SELECT ROW_NUMBER() OVER (ORDER BY s1.[object_id])
        FROM sys.all_objects AS s1 CROSS APPLY sys.all_objects) AS n(Number)
    WHERE Number <= CONVERT(INT, LEN(@List))
        AND SUBSTRING(@Delimiter + @List, Number, 1) = @Delimiter
    ) AS y);
GO

Tôi đã thảo luận về một số người khác ở đây, tại đây và một cách tiếp cận tốt hơn là tách ra ngay từ đầu ở đây.

Bây giờ bạn có thể ngoại suy đơn giản bằng cách:

SELECT s.[message-id], f.Item
  FROM dbo.SourceData AS s
  CROSS APPLY dbo.SplitStrings(s.[recipient-address], ';') as f;

Ngoài ra, tôi đề nghị không đặt dấu gạch ngang trong tên cột. Có nghĩa là bạn luôn phải đặt chúng trong [square brackets] .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Thống kê gia tăng SQL Server 2014

  2. Tạo cột “Sửa đổi lần cuối” trong SQL Server

  3. @@ IDENTITY, SCOPE_IDENTITY (), OUTPUT và các phương pháp truy xuất danh tính cuối cùng khác

  4. Chuyển đổi một tập hợp các hàng thành các cột trong SQL Server 2000

  5. So sánh các ngày được lưu trữ dưới dạng varchar