SORU
30 Mart 2011, ÇARŞAMBA


Tek satır içine Virgülle Ayrılmış bir dize dönüm

Böyle bir SQL Tablosu var:

| SomeID         | OtherID     | Data
 ---------------- ------------- -------------------
| abcdef-.....   | cdef123-... | 18,20,22
| abcdef-.....   | 4554a24-... | 17,19
| 987654-.....   | 12324a2-... | 13,19,20

tek tek satır döndüren SELECT OtherID, SplitData WHERE SomeID = 'abcdef-.......' gibi bir sorgu, bu şekilde gerçekleştirmek nerede, orada bir sorgu

| OtherID     | SplitData
 ------------- -------------------
| cdef123-... | 18
| cdef123-... | 20
| cdef123-... | 22
| 4554a24-... | 17
| 4554a24-... | 19

Temelde tek tek satırlara virgül verilerimi split?

İlişkisel bir veritabanı içine virgülle ayrılmış bir dize saklamak aptalca geliyor biliyorum, ama tüketici bu uygulamanın normal kullanma durumu gerçekten yararlı hale getirir.

Disk belleği ihtiyacım var uygulama olarak split yapmak istemiyorum, tüm app yeniden düzenleme önce seçeneklerini keşfetmek istedim.

SQL Server 2008 (R2 olmayan).

CEVAP
30 Mart 2011, ÇARŞAMBA


SQL Server harika özyinelemeli işlevleri kullanabilirsiniz

Örnek tablo

create table Testdata(SomeID int, OtherID int, Data varchar(max))
insert Testdata select 1, 9, '18,20,22'
insert Testdata select 2, 8, '17,19'
insert Testdata select 3, 7, '13,19,20'
insert Testdata select 4, 6, ''

Sorgu

;with tmp(SomeID, OtherID, DataItem, Data) as (
select SomeID, OtherID, LEFT(Data, CHARINDEX(',',Data ',')-1),
    STUFF(Data, 1, CHARINDEX(',',Data ','), '')
from Testdata
union all
select SomeID, OtherID, LEFT(Data, CHARINDEX(',',Data ',')-1),
    STUFF(Data, 1, CHARINDEX(',',Data ','), '')
from tmp
where Data > ''
)
select SomeID, OtherID, DataItem
from tmp
order by SomeID
-- OPTION (maxrecursion 0)
-- normally recursion is limited to 100. If you know you have very long
-- strings, uncomment the option

Çıktı

SomeID  OtherID  DataItem
1       9        18
1       9        20
1       9        22
2       8        17
2       8        19
3       7        13
3       7        19
3       7        20
4       6   
9       11       1
9       11       2
9       11       3
9       11       4
etc.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Andrew_Huang

    Andrew_Huang

    10 ŞUBAT 2006
  • George McCarron

    George McCar

    29 Mayıs 2013
  • steven johns

    steven johns

    11 Mart 2011