[ Đăng nhập | Ghi danh ]

Cắt chuỗi thành một mảng trong SQL SERVER

Bài viết được cập nhật từ 11:01:13 SA, 01 Tháng Tư 2013 bởi thinnguyen

Tôi có 1 table Product có 2 column: ProductId (primary key) và ProductName. Làm thế nào để lấy products từ chuỗi chứa danh sách ProductId cần lấy. Ví dụ tôi cần lấy các product mà có Id được liệt kê trong chuỗi như sau: “135,345,434,509,620”.

Với ví dụ này thì có nhiều cách để làm nhưng ở đây tôi chọn phương pháp cắt chuỗi thành 1 mảng trong SQL SERVER. Và cái tôi muốn chuỗi trên thành 1 table có dạng như bên dưới để tôi có thể dễ dàng truy vấn:
Id


-----
135
345
434
509
620

Để làm được điều này trước tiên ta cần phải viết 1 function để biến chuỗi trên thành 1 table. Nội dung function như sau:

CREATE FUNCTION [dbo].[SplitStringToTable]
(
    @string NVARCHAR(MAX),
    @delimiter CHAR(1)
)
RETURNS @output TABLE(
    data NVARCHAR(MAX)
)
BEGIN
    DECLARE @start INT, @end INT
    SELECT @start = 1, @end = CHARINDEX(@delimiter, @string)

    WHILE @start < LEN(@string) + 1 BEGIN
        IF @end = 0 
            SET @end = LEN(@string) + 1

        INSERT INTO @output (data) 
        VALUES(SUBSTRING(@string, @start, @end - @start))
        SET @start = @end + 1
        SET @end = CHARINDEX(@delimiter, @string, @start)
    END
    RETURN
END

Chú ý function này có 2 param gồm @string và @delimiter, trong đó @string là chuỗi cần xử lí thành 1 table, và @delimiter kí tự để cắt chuỗi.

Cuối cùng ta chỉ cần viết câu truy vấn để lấy dữ liệu như sau:

SELECT	* 
FROM	Product 
WHERE	ProductId IN (SELECT * FROM [dbo].[SplitStringToTable]('135,345,434,509,620', ','))

Ngoài cách này ra thì còn có những cách khác, đây chỉ là một trong các lựa chọn của tôi mà thôi.

Update comment..