[SQL] Sử dụng Split String và Cross Join để tách chuỗi thành nhiều dòng

Trong bài viết này, tôi sẽ hướng dẫn các bạn cách tách chuỗi được phân cách bằng dấu phẩy thành nhiều dòng.
Giả sử bạn có table như sau:

Create Table #CustomerTemp(CustomerId int, Districts varchar(max))

Insert #CustomerTemp(CustomerId, Districts) Values(1, 'District 1, District 2, District 3');

Select * from #CustomerTemp

Drop Table #CustomerTemp

Và bạn muốn tách từng District ra thành nhiều dòng:


Đối với SQL Server 2014 trở về trước

Tạo hàm Split và kết bảng dùng Cross Join

CREATE FUNCTION [dbo].[Split]
(
 @SearchString NVARCHAR (max),
 @Separator NVARCHAR (5)
)
 
RETURNS @strtable TABLE (strval NVARCHAR (max))
AS
 
BEGIN
 DECLARE @SeparatorLength INT
 SET @SeparatorLength = DATALENGTH(@Separator) / 2
 
 IF (@SeparatorLength = 0)
  RETURN
 
 WHILE 1=1
 BEGIN
  IF (CHARINDEX(@Separator,@SearchString) = 0)
  BEGIN
   INSERT INTO @strtable
   VALUES (@SearchString);
   BREAK;
  END
 
  INSERT INTO @strtable
  VALUES ( LEFT(@SearchString, CHARINDEX(@Separator,@SearchString) - 1))
 
  SET @SearchString = RIGHT(@SearchString, DATALENGTH(@SearchString)/2 - CHARINDEX(@Separator,@SearchString) - @SeparatorLength + 1)
 END
 RETURN
END
GO
Lưu ý câu lệnh:
RETURNS @strtable TABLE (strval NVARCHAR (max))
strval là tên field trả về. VD:
Select district.* from dbo.Split('2,3,4', ',') as district
Bạn sẽ có kết quả:

Sử dụng Cross Join để trả về tích Đề các của 2 bảng
SELECT t.CustomerId, district.*
FROM #CustomerTemp t
CROSS APPLY dbo.Split(t.Districts, ',') as district

Tổng hợp lại, ta có đoạn code dưới đây:
Create Table #CustomerTemp(CustomerId int, Districts varchar(max))

Insert #CustomerTemp(CustomerId, Districts) Values(1, 'District 1,District 2,District 3');
Insert #CustomerTemp(CustomerId, Districts) Values(2, 'District 4,District 5,District 6');

Select * from #CustomerTemp

SELECT t.CustomerId, district.*
FROM #CustomerTemp t
CROSS APPLY dbo.Split(t.Districts, ',') as district

Drop Table #CustomerTemp

Đối với SQL Server 2016 trở lên

Bạn sử dụng hàm STRING_SPLIT()

SELECT t.CustomerId, district.*
FROM #CustomerTemp t
CROSS APPLY STRING_SPLIT(t.Districts, ',') as district

Tham khảo

Splitting and Joining strings in SQL Server

Chúc các bạn thành công.