Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Cara efisien untuk memisahkan string menggunakan CTE

Sepertinya Anda sudah mati dalam menggunakan CTE, jadi coba ini:

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

KELUARAN:

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

(8 row(s) affected)

di sini adalah artikel bagus tentang pemisahan string di SQL Server:"Array dan Daftar di SQL Server 2005 dan Selanjutnya, Ketika Parameter Nilai Tabel Tidak Memotongnya" oleh Erland Sommarskog

EDIT inilah versi lain (tetapi Anda memerlukan tabel angka) mengembalikan hasil yang sama seperti di atas:

;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

lihat di sini untuk tabel angka:Apa cara terbaik untuk membuat dan mengisi tabel angka?



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SSRS menampilkan top n tetapi SUM menyertakan semua nilai

  2. Sintaks salah di dekat kata kunci 'GROUP' IN SQL

  3. mengapa saya tidak bisa membuat database SQL di VS 2010?

  4. Gambar dalam database vs sistem file

  5. Urutan SQLAlchemy berdasarkan hasil fungsi