2009-06-26 34 views
46

Çıktılarımı biçimlendirmek için TSQL sözdizimi nedir, böylece sütun değerleri virgülle ayrılmış bir dize olarak görünür.Sütun Değerlerini Virgülle Ayrılmış Bir Listeye Birleştirme

Örnek, benim masa ARABALAR vardır aşağıdadır:

CarID CarName 
---------------- 
    1 Porsche 
    2 Mercedes 
    3 Ferrari 

Araba isimleri olarak nasıl alabilirim: Porsche, Mercedes, Ferrari

+1

group_concat (field_here, '') MySQL kullanıyorsanız. PostgreSQL kullanıyorsanız array_to_string (array_accum (field_here), ','). ancak MSSQL kullandığınızdan, sadece virgülle ayrılmış dizeyi döndüren bir işlev oluşturun. ConcernedOfTunbridgeW kod snippet'ini kullanın, bir işleve koyun – Hao

+2

Etikette tsql yazıyor. –

+1

Aynı sorunun haftada en az bir kez sorulduğuna ve kimsenin cevapları ilk önce aramaya başlamadığına inanamıyorum. sadece "sql virgül" için arama yapın – van

cevap

40

Bir kaydından dizeleri bir dizi bağlamak için coalesce kullanarak bir kısayol yapabilirsiniz örneğin bir tabloda.

declare @aa varchar (200) 
set @aa = '' 

select @aa = 
    case when @aa = '' 
    then CarName 
    else @aa + coalesce(',' + CarName, '') 
    end 
    from Cars 

print @aa 
+0

neden init @aa 'yerine' 'sadece' 'null'' kontrol ediliyor yerine '' '? Ayrıca, neden birleşme? son olarak, 'CarName' ile 'isnull (CarName,' ') 'güvenliğini sağlamak istemiyor musunuz? –

+0

"Birleşiminiz" yanlış yerde; CarName'i boş değere sahip durumlarda boşluklara dönüştürmek için CarName'i @aa + coalesce (',' + CarName, '') '(önerilen düzenlemeyi denetle) gibi sarmalamalıdır. Elinizde olduğu gibi, 'aa' her zaman CarName NULL boş olacak. – Slight

+0

@ConcernedOfTunbridgeWells - Bu yaklaşım, aşağıdaki gibi dinamik SQL deyimlerini gerçekleştirmek için kullanılabilir: 'col1 SEL1 adı' olarak adlandır, 'coln adı' FROM

'olarak adlandırılır? – NickBraunagel

7
DECLARE @CarList nvarchar(max); 
SET @CarList = N''; 
SELECT @CarList+=CarName+N',' 
FROM dbo.CARS; 
SELECT LEFT(@CarList,LEN(@CarList)-1); 

Teşekkür SO bana bir sorgu sırasında veri birikimi kullandığı tespit kim kaynaklanmaktadır.

+0

"CarName" bir int (yani, "CarId)" ise, SELECT @ CarList + = CONVERT (varchar (20), CarId, 0) + N ',' – samosaris

54
SELECT LEFT(Car, LEN(Car) - 1) 
FROM (
    SELECT Car + ', ' 
    FROM Cars 
    FOR XML PATH ('') 
) c (Car) 
+3

'un yaptıklarına şükür: Teşekkürler. Bir alt sorgusu cevabını, TSQL sözdiziminin bu kısmına izin veren kısmını da dahil edip edemeyeceğini merak ediyorum… –

+0

Bu, Stackoverflow'ta aldığım bir yapıdır, herhangi bir TSQL'de nereden bahsedileceğini bile bilmiyorum. Spesifikasyon –

+0

iyi cevap .. teşekkürler +1 –

6

sorgu içinde Başka bir çözüm:

select 
    Id, 
    STUFF(
     (select (', "' + od.ProductName + '"') 
     from OrderDetails od (nolock) 
     where od.Order_Id = o.Id 
     order by od.ProductName 
     FOR XML PATH('')), 1, 2, '' 
    ) ProductNames 
from Orders o (nolock) 
where o.Customer_Id = 525188 
order by o.Id desc 

(DÜZENLEME: STUFF beyanı için teşekkürler @ user007)

+0

Netezza'da bunun için bir çözüm var – SMPH

19

Bunu kullanarak şeyler yapabilirsiniz:

SELECT Stuff(
    (
    SELECT ', ' + CARS.CarName 
    FROM CARS 
    FOR XML PATH('') 
    ), 1, 2, '') AS CarNames 
+0

Temel olarak buradaki cevabın basitleştirilmiş bir versiyonu - http://stackoverflow.com/questions/6899/how-to-create-a-sql-server-function-to-join -çok-satır-bir-alt-sıra-içine-ama ben bu kişinin basitlik daha taşınabilir buldum çünkü SSMSBoost veya Redgate SQLPrompt gibi bir "snippet yöneticisi" içine takabilirsiniz ve kendi kişisel araç kutusuna kaydedebilirsiniz. – NateJ

2
DECLARE @SQL AS VARCHAR(8000) 
SELECT @SQL = ISNULL(@SQL+',','') + ColumnName FROM TableName 
SELECT @SQL 
+0

@PhilS, Hayır, Doğru cevap verecektir, eğer yukarıdaki sorguyu çalışanlar tablosunda isimler üzerinde çalıştırırsanız, örnek sonucu Jhon, Thomas, PhilS – User

+0

@john: Oh, gerçekten haklısınız. Özür dilerim benim hatam. Ben downvote tersine çevirirdim, ama sistem cevap düzenlenmiş sürece beni izin vermez ... – PhilS

8

SQL Server 2017 veya A üzerinde çalışıyorsanız Zure SQL Veritabanı Eğer böyle bir şey yapmak:

SELECT STRING_AGG(CarName,',') as CarNames 
FROM CARS 
+0

Garip bu downvoted oldu. – John

+0

Bu fonksiyonun yaratılmasının zamanı geldi! – Davos

1

aşağıdaki kodla bu deneyin:

DECLARE @listStr VARCHAR(MAX) 
SELECT @listStr = COALESCE(@listStr+',' , '') + CarName 
FROM Cars 
SELECT @listStr 
İlgili konular