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:
Và bạn muốn tách từng District ra thành nhiều dòng:
Sử dụng Cross Join để trả về tích Đề các của 2 bảng
Tổng hợp lại, ta có đoạn code dưới đây:
Chúc các bạn thành cô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 ServerChúc các bạn thành công.
Nhận xét
Đăng nhận xét