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

  • André Frizzo

    André Frizz

    16 Aralık 2006
  • Droid Life

    Droid Life

    17 Kasım 2009
  • laptopmag

    laptopmag

    25 Ocak 2008