2009-10-14 12 views
10

Próbuję użyć SQL zbudować rozdzielona przecinkami lista cat_id zaBudowanie listy oddzielonej przecinkami?

kodu jest:

declare  @output varchar(max) 
set   @output = null; 
select @output = COALESCE(@output + ', ', '') + convert(varchar(max),cat_id) 

edit: zmieniony '' null, nadal ten sam. ale wyjście im się to tak:

, 66 , 23 

wiodącym przecinek nie powinno tam być. Co przegapiłem?

Odpowiedz

37

Czy korzystasz z SQL 2005? Z rekwizytami do Rob Farley który mi pokazał to niedawno:

SELECT stuff((
    SELECT ', ' + cast(cat_id as varchar(max)) 
    FROM categories 
    FOR XML PATH('') 
    ), 1, 2, ''); 

The zapytania wewnątrz (z FOR XML PATH('')) wybiera listę oddzielonych przecinkami identyfikatorów kategorii, z wiodącym „”. Zapytanie zewnętrzne używa funkcji stuff do usuwania początkowego przecinka i spacji.

Nie mam instancji SQL przydatnej do przetestowania tego, więc pochodzi z pamięci. Być może będziesz musiał grać z parametrami rzeczy itp., Aby działał dokładnie tak, jak chcesz.

+0

Ok, Przetestowałem go i działa jak jest. Zdecydowanie polecam to przez technikę "dodaj do zmiennej". –

+1

co to za kreteńskie doświadczenie, które tutaj zademonstrowałeś! Rozpocznij demony! – JDPeckham

+0

Chciałem dołączyć do tej odpowiedzi - dla wielu instrukcji STUFF chcesz, aby parametry były 1 i 1, a nie 1 i 2, aby utworzyć listę rozdzieloną przecinkami. Odpowiedź Matta używa 2, ponieważ po każdym przecinku ma spację. Aby uzyskać więcej informacji, zobacz artykuł MSDN: http://msdn.microsoft.com/en-us/library/ms188043.aspx – Ryanman

0

check @output wartość tuż przed wykonaniem tego zapytania, myślę, że to nie jest równa NULL ale '' (pusty ciąg znaków)

EDIT: (po @auth edytowane pytanie)

teraz Jestem pewien, że to '',

trzeba zainicjować go NULL

to zrobić niezależnie od CONCAT_NULL_YIELDS_NULL, używać starego CASE WHEN:

select @output = NULL 
select @output = CASE WHEN @output IS NULL THEN '' ELSE @output+', ' END + value 
+0

nawet wtedy 'CONCAT_NULL_YIELDS_NULL' musi być ustawiony na' ON' –

+0

prawo, dzięki, I didn Wiesz, że taka opcja istniała! – manji

0

Czy zainicjalizowano @ output na pusty ciąg znaków? COALESCE działa tylko wtedy, gdy jest ciągiem NULL.

0

To, co robisz źle jest to, że @output nie jest zerowy od początku, ale pusty ciąg. Ustaw wartość @ output na null przed pętlą (lub jeśli nie jest używana, ponieważ została zadeklarowana, nie przypisuj do niej pustego ciągu znaków).

2

COALESCE Returns the first nonnull expression among its arguments

pierwszy argument @output + ', ' nigdy nie jest zerowy (chyba zainicjować @output jako nieważną i ustawić CONCAT_NULL_YIELDS_NULL do ON), więc to zawsze zwracane.

+1

+1 dla wskaźnika do właściwości ANSI. Użyj "select sessionproperty (" CONCAT_NULL_YIELDS_NULL ")", aby zobaczyć jego bieżącą wartość; domyślnie jest to 1, ale jeśli jest 0, spowodowałoby to niepowodzenie plakatu COALESCE. – Andomar

0

A czasami ...

trzeba odpowiedzieć na własne pytanie

declare  @output varchar(max) 
select  @output = case when (@output is null) then '' else ', ' END + convert(varchar(max),cat_id) 
1
declare  @output varchar(max) 

select  @output = coalesce 
         ( 
          @output + ', ' + convert(varchar(max),cat_id), 
          convert(varchar(max),cat_id) 
        ) 
from  yourTableHere 

print  @output 
0

Nie wiem, czy dotyczy to dokładnie to, czego szukasz, ale znalazłem na to prawo w tym samym czasie znalazłem twoje pytania. Używam drugiego rozwiązania z FOR XML PATH, o którym wspominał Matt Hamilton. Sprawdziło się doskonale.

Konkatenacja wierszy - autor Carl P.Anderson, 2009/10/14

http://www.sqlservercentral.com/articles/T-SQL/67973/

0
/osp/install/idp/bin/sqlminus "select ri || ',' ||name|| ',' || numports || ',' || ascii(OVRONSET) from sdfctigw.ivrgrp where GRP_BEP is not null;" | sort -h 
1,COMO INTERNAL 2,700,90 
7,LOADIVR,10,80 
10,SPEECH_IVR_PROD,600,95 
Powiązane problemy