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

  • PremiumBeat.com - Royalty Free Music

    PremiumBeat.

    16 Kasım 2008
  • Sam Kear

    Sam Kear

    14 Temmuz 2007
  • thelonelyisland

    thelonelyisl

    23 Aralık 2005