Saya memiliki Tabel SQL seperti ini:
| SomeID | OtherID | Data
+----------------+-------------+-------------------
| abcdef-..... | cdef123-... | 18,20,22
| abcdef-..... | 4554a24-... | 17,19
| 987654-..... | 12324a2-... | 13,19,20
apakah ada kueri di mana saya dapat melakukan kueri seperti SELECT OtherID, SplitData WHERE SomeID = 'abcdef-.......'
yang mengembalikan baris individual, seperti ini:
| OtherID | SplitData
+-------------+-------------------
| cdef123-... | 18
| cdef123-... | 20
| cdef123-... | 22
| 4554a24-... | 17
| 4554a24-... | 19
Pada dasarnya membagi data saya di koma menjadi baris individual?
Saya sadar bahwa menyimpan comma-separated
string ke dalam basis data relasional terdengar bodoh, tetapi kasus penggunaan normal dalam aplikasi konsumen membuatnya sangat membantu.
Saya tidak ingin melakukan pemisahan dalam aplikasi karena saya perlu paging, jadi saya ingin menjelajahi opsi sebelum refactoring seluruh aplikasi.
Ini SQL Server 2008
(non-R2).
sql-server
tsql
split
comma
Michael Stum
sumber
sumber
Jawaban:
Anda dapat menggunakan fungsi rekursif yang luar biasa dari SQL Server:
Tabel sampel:
Kueri
Keluaran
sumber
Data
darivarchar(max)
menjadivarchar(4000)
, misalnyacreate table Testdata(SomeID int, OtherID int, Data varchar(4000))
?OPTION (maxrecursion 0)
Akhirnya, penantian berakhir dengan SQL Server 2016 . Mereka telah memperkenalkan fungsi string yang Split,
STRING_SPLIT
:Semua metode lain untuk memisahkan string seperti XML, Tally table, while, dll. Telah terpesona oleh
STRING_SPLIT
fungsi ini .Inilah artikel yang sangat bagus dengan perbandingan kinerja: Kejutan Kinerja dan Asumsi: STRING_SPLIT .
Untuk versi yang lebih lama, menggunakan tabel penghitungan di sini adalah satu fungsi string split (pendekatan terbaik)
Disebut dari Tally OH! Fungsi SQL 8K “CSV Splitter” yang Ditingkatkan
sumber
value
, bukanSplitData
.Periksa ini
sumber
sumber
CROSS APPLY
, itu agak berguna!select t.OtherID, x.* from testData t cross apply (select item as Data from dbo.Split(t.Data,',') ) x
Mulai Februari 2016 - lihat Contoh Tabel TALLY - sangat mungkin mengungguli TVF saya di bawah ini, mulai Februari 2014. Menyimpan posting asli di bawah ini untuk anak cucu:
Terlalu banyak kode berulang untuk seleraku dalam contoh di atas. Dan saya tidak suka kinerja CTE dan XML. Juga, eksplisit
Id
sehingga konsumen yang spesifik pesanan dapat menentukanORDER BY
klausa.sumber
Senang melihat bahwa itu telah diselesaikan dalam versi 2016, tetapi untuk semua yang tidak pada itu, di sini adalah dua versi umum dan disederhanakan dari metode di atas.
Metode XML lebih pendek, tetapi tentu saja membutuhkan string untuk memungkinkan xml-trick (tidak ada karakter 'buruk'.)
Metode XML:
Metode rekursif:
Berfungsi dalam aksi
XML-METHOD 2: Unicode Friendly 😀 (Tambahan milik Max Hodges)
create function dbo.splitString(@input nVarchar(max), @Splitter nVarchar(99)) returns table as Return SELECT Split.a.value('.', 'NVARCHAR(max)') AS Data FROM ( SELECT CAST ('<M>' + REPLACE(@input, @Splitter, '</M><M>') + '</M>' AS XML) AS Data ) AS A CROSS APPLY Data.nodes ('/M') AS Split(a);
sumber
Silakan merujuk di bawah TSQL. Fungsi STRING_SPLIT hanya tersedia di bawah level kompatibilitas 130 ke atas.
TSQL:
HASIL:
Warna
merah biru hijau kuning hitam
sumber
Sangat terlambat tetapi cobalah ini:
Jadi kami mengalami ini: tbl_Sample:
Setelah menjalankan kueri ini:
Terima kasih!
sumber
STRING_SPLIT
bagus tetapi membutuhkan SQL Server 2016. docs.microsoft.com/en-us/sql/t-sql/functions/…sumber
dengan hanya sedikit modifikasi kecil ke kueri di atas ...
sumber
Saya selalu menggunakan metode XML. Pastikan Anda menggunakan VALID XML. Saya memiliki dua fungsi untuk mengkonversi antara XML dan Teks yang valid. (Saya cenderung menghapus carriage return karena saya biasanya tidak membutuhkannya.
sumber
SELECT (SELECT '<&> blah' + CHAR(13)+CHAR(10) + 'next line' FOR XML PATH(''))
Fungsi
Gunakan kasing
Atau hanya pilih dengan hasil beberapa set
sumber
Di bawah ini berfungsi pada sql server 2008
Akan mendapatkan semua produk Cartesian dengan kolom tabel asal plus "item" dari tabel split.
sumber
Anda dapat menggunakan fungsi berikut untuk mengekstrak data
sumber