我試着使用SQL打造CAT_ID的建立逗號分隔列表?
代碼中的逗號分隔的列表是:
declare @output varchar(max)
set @output = null;
select @output = COALESCE(@output + ', ', '') + convert(varchar(max),cat_id)
編輯:改變'爲null,依然相同。 但輸出即時得到像這樣:
, 66 , 23
領先的逗號不應該存在。我錯過了什麼?
我試着使用SQL打造CAT_ID的建立逗號分隔列表?
代碼中的逗號分隔的列表是:
declare @output varchar(max)
set @output = null;
select @output = COALESCE(@output + ', ', '') + convert(varchar(max),cat_id)
編輯:改變'爲null,依然相同。 但輸出即時得到像這樣:
, 66 , 23
領先的逗號不應該存在。我錯過了什麼?
你在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實例可以方便地測試這個,所以它來自內存。你可能需要玩這些東西參數等,才能使其正常工作。
檢查@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
即使此時需要將'CONCAT_NULL_YIELDS_NULL'設置爲'ON' – 2009-10-14 08:46:39
對,謝謝,我沒有不知道這樣的選擇存在! – manji 2009-10-14 09:10:54
你是否初始化@output爲空字符串?如果它是一個NULL字符串,COALESCE只會起作用。
你做錯了什麼是@output不是從開始,而是一個空字符串。在循環之前將@output設置爲null(或者如果它沒有被使用,因爲它被聲明爲只是不分配空字符串)。
COALESCE Returns the first nonnull expression among its arguments
第一個參數@output + ', '
永遠不能爲null(除非你初始化@output
爲NULL,並設置CONCAT_NULL_YIELDS_NULL
到ON
),所以它總是返回。
用於指向ANSI屬性的指針。使用「select sessionproperty('CONCAT_NULL_YIELDS_NULL')」來查看其當前值;默認情況下爲1,但如果爲0,則會導致發佈者的COALESCE失敗。 – Andomar 2009-10-14 09:56:19
有時...
你必須回答自己的問題
declare @output varchar(max)
select @output = case when (@output is null) then '' else ', ' END + convert(varchar(max),cat_id)
declare @output varchar(max)
select @output = coalesce
(
@output + ', ' + convert(varchar(max),cat_id),
convert(varchar(max),cat_id)
)
from yourTableHere
print @output
不知道這究竟適用於你在尋找什麼,但我發現這個權利在同時我找到了你的問題。我使用FOR XML PATH的第二個解決方案,這是Matt Hamilton上面提到的。這對我很好。
連接行 - 由Carl P.安德森2009/10/14
/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
好吧,我測試了它和它的作品原樣。我肯定會推薦這個'附加到變量'技術。 – 2009-10-15 01:51:36
什麼是你在這裏演示的這個野生SQL魔法!從惡魔! – JDPeckham 2012-11-13 15:19:31
我想追加到這個答案 - 對於很多STUFF語句,您希望參數爲1和1,而不是1和2來創建真正的逗號分隔列表。馬特的答案使用2,因爲他在每個逗號後都有一個空格。有關詳細信息,請查看MSDN文章:http://msdn.microsoft.com/en-us/library/ms188043.aspx – Ryanman 2015-01-07 19:37:46