2009-10-14 116 views
10

我試着使用SQL打造CAT_ID的建立逗號分隔列表?

代碼中的逗號分隔的列表是:

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

編輯:改變'爲null,依然相同。 但輸出即時得到像這樣:

, 66 , 23 

領先的逗號不應該存在。我錯過了什麼?

回答

37

你在SQL 2005中嗎?隨着道具Rob Farley誰發現我這個剛剛:

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

內部查詢(用FOR XML PATH(''))選擇一個逗號分隔的類ID列表,擁有國內領先「」。外部查詢使用stuff函數刪除前導逗號和空格。

我沒有一個SQL實例可以方便地測試這個,所以它來自內存。你可能需要玩這些東西參數等,才能使其正常工作。

+0

好吧,我測試了它和它的作品原樣。我肯定會推薦這個'附加到變量'技術。 – 2009-10-15 01:51:36

+1

什麼是你在這裏演示的這個野生SQL魔法!從惡魔! – JDPeckham 2012-11-13 15:19:31

+0

我想追加到這個答案 - 對於很多STUFF語句,您希望參數爲1和1,而不是1和2來創建真正的逗號分隔列表。馬特的答案使用2,因爲他在每個逗號後都有一個空格。有關詳細信息,請查看MSDN文章:http://msdn.microsoft.com/en-us/library/ms188043.aspx – Ryanman 2015-01-07 19:37:46

0

檢查@output值只是這個查詢的執行之前,我認爲這不是等於NULL,而是「」(空字符串)

編輯:(後@auth編輯的問題)

現在

我敢肯定,這「」,

,你必須把它初始化爲NULL

獨立做的CONCAT_NULL_YIELDS_NULL,使用舊CASE WHEN

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

即使此時需要將'CONCAT_NULL_YIELDS_NULL'設置爲'ON' – 2009-10-14 08:46:39

+0

對,謝謝,我沒有不知道這樣的選擇存在! – manji 2009-10-14 09:10:54

0

你是否初始化@output爲空字符串?如果它是一個NULL字符串,COALESCE只會起作用。

0

你做錯了什麼是@output不是從開始,而是一個空字符串。在循環之前將@output設置爲null(或者如果它沒有被使用,因爲它被聲明爲只是不分配空字符串)。

2

COALESCE Returns the first nonnull expression among its arguments

第一個參數@output + ', '永遠不能爲null(除非你初始化@output爲NULL,並設置CONCAT_NULL_YIELDS_NULLON),所以它總是返回。

+1

用於指向ANSI屬性的指針。使用「select sessionproperty('CONCAT_NULL_YIELDS_NULL')」來查看其當前值;默認情況下爲1,但如果爲0,則會導致發佈者的COALESCE失敗。 – Andomar 2009-10-14 09:56:19

0

有時...

你必須回答自己的問題

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

不知道這究竟適用於你在尋找什麼,但我發現這個權利在同時我找到了你的問題。我使用FOR XML PATH的第二個解決方案,這是Matt Hamilton上面提到的。這對我很好。

連接行 - 由Carl P.安德森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