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

Cách hiệu quả để tách chuỗi bằng CTE

Bạn có vẻ đã chết khi sử dụng CTE, vì vậy hãy thử cách này:

DECLARE @YourTable table (RowID int, Layout varchar(200))
INSERT @YourTable VALUES (1,'hello,world,welcome,to,tsql')
INSERT @YourTable VALUES (2,'welcome,to,stackoverflow')

;WITH SplitSting AS
(
    SELECT
        RowID,LEFT(Layout,CHARINDEX(',',Layout)-1) AS Part
            ,RIGHT(Layout,LEN(Layout)-CHARINDEX(',',Layout)) AS Remainder
        FROM @YourTable
        WHERE Layout IS NOT NULL AND CHARINDEX(',',Layout)>0
    UNION ALL
    SELECT
        RowID,LEFT(Remainder,CHARINDEX(',',Remainder)-1)
            ,RIGHT(Remainder,LEN(Remainder)-CHARINDEX(',',Remainder))
        FROM SplitSting
        WHERE Remainder IS NOT NULL AND CHARINDEX(',',Remainder)>0
    UNION ALL
    SELECT
        RowID,Remainder,null
        FROM SplitSting
        WHERE Remainder IS NOT NULL AND CHARINDEX(',',Remainder)=0
)
SELECT * FROM SplitSting ORDER BY RowID

ĐẦU RA:

RowID       Part                   
----------- -----------------------
1           hello                  
1           world                  
1           welcome                
1           to                     
1           tsql                   
2           welcome                
2           to                     
2           stackoverflow          

(8 row(s) affected)

đây là một bài viết tuyệt vời về tách chuỗi trong SQL Server: "Mảng và danh sách trong SQL Server 2005 và hơn thế nữa, Khi các tham số giá trị bảng không cắt nó "của Erland Sommarskog

CHỈNH SỬA đây là một phiên bản khác (nhưng bạn cần một bảng số) trả về kết quả tương tự như trên:

;WITH SplitValues AS
(
    SELECT
        RowID,ListValue
        FROM (SELECT
                  RowID, LTRIM(RTRIM(SUBSTRING(List2, number+1, CHARINDEX(',', List2, number+1)-number - 1))) AS ListValue
                  FROM (
                           SELECT RowID, ',' + Layout + ',' AS List2
                           FROM @YourTable
                       ) AS dt
                      INNER JOIN Numbers n ON n.Number < LEN(dt.List2)
                  WHERE SUBSTRING(List2, number, 1) = ','
             ) dt2
        WHERE ListValue IS NOT NULL AND ListValue!=''
)
SELECT * FROM SplitValues

xem bảng số ở đây: Cách tốt nhất để tạo và điền bảng số là gì?



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tổng hợp truy vấn SQL có thể không xuất hiện trong mệnh đề WHERE

  2. Đã xảy ra thao tác dấu phẩy động không hợp lệ

  3. 3 cách trả về danh sách công việc tác nhân máy chủ SQL (T-SQL)

  4. Tại sao không Lỗi XYZ tên cột không hợp lệ trong truy vấn con; mặc dù tên cột không có trong bảng truy vấn con?

  5. DATETIMEOFFSETFROMPARTS () Ví dụ trong SQL Server (T-SQL)