Sql 如何在Stuff函数中包含空值?
我正在使用一个表开发一个Sql视图,使用Stuff函数将结果作为每个唯一id的逗号分隔。但在许多情况下,id具有空值,而另一行中的同一id具有一些常规值。最后,视图显示两行相同id的数据,一行为NULL,另一行为逗号分隔的值。我只想要一排。如何做到这一点?以下是我的理解代码:Sql 如何在Stuff函数中包含空值?,sql,sql-server,Sql,Sql Server,我正在使用一个表开发一个Sql视图,使用Stuff函数将结果作为每个唯一id的逗号分隔。但在许多情况下,id具有空值,而另一行中的同一id具有一些常规值。最后,视图显示两行相同id的数据,一行为NULL,另一行为逗号分隔的值。我只想要一排。如何做到这一点?以下是我的理解代码: CREATE VIEW BM_RLOS_VW_RCO_AUTH AS (SELECT DISTINCT A.bpm_referenceno AS ref_no, STUFF((SELECT ', '+B.tak
CREATE VIEW BM_RLOS_VW_RCO_AUTH
AS
(SELECT DISTINCT
A.bpm_referenceno AS ref_no,
STUFF((SELECT ', '+B.takenby
FROM BM_RLOS_DecisionHistoryForm B
WHERE A.winame ='RCO' AND A.bpm_referenceno=B.bpm_referenceno FOR XML PATH(''),Type).value('.','nvarchar(max)'),1,2,'') takenby
FROM BM_RLOS_DecisionHistoryForm A
)
在列中选中ISNULL
CREATE VIEW BM_RLOS_VW_RCO_AUTH
AS
(
SELECT DISTINCT A.bpm_referenceno AS ref_no,
STUFF((SELECT ', '+ ISNULL( B.takenby ,'' )
FROM BM_RLOS_DecisionHistoryForm B
WHERE A.winame ='RCO' AND A.bpm_referenceno=B.bpm_referenceno FOR XML
PATH(''),Type).value('.','nvarchar(max)'),1,2,'') takenby
FROM BM_RLOS_DecisionHistoryForm A
)
您可以尝试以下选项。 如果您想为空值显示“NULL”,请尝试下面的操作
CREATE VIEW BM_RLOS_VW_RCO_AUTH
AS
(SELECT DISTINCT
A.bpm_referenceno AS ref_no,
STUFF((SELECT ', '+ ISNULL(B.takenby, 'NULL')
FROM BM_RLOS_DecisionHistoryForm B
WHERE A.winame ='RCO' AND A.bpm_referenceno=B.bpm_referenceno FOR XML PATH(''),Type).value('.','nvarchar(max)'),1,2,'') takenby
FROM BM_RLOS_DecisionHistoryForm A
)
或者,如果您想跳过空值,请尝试下面的操作
CREATE VIEW BM_RLOS_VW_RCO_AUTH
AS
(SELECT DISTINCT
A.bpm_referenceno AS ref_no,
STUFF((SELECT ', '+B.takenby
FROM BM_RLOS_DecisionHistoryForm B
WHERE A.winame ='RCO' AND B.takenby IS NOT NULL AND A.bpm_referenceno=B.bpm_referenceno FOR XML PATH(''),Type).value('.','nvarchar(max)'),1,2,'') takenby
FROM BM_RLOS_DecisionHistoryForm A
)
问题在于
STUFF
中的A.winame='RCO'
过滤器,当外层行不是'RCO'
时,它将返回NULL
,而当外部行是'RCO'
时,它将返回一个NOTNULL值,从而为同一ref\u no
生成两个不同的行
尝试此操作(按B
而不是A
进行筛选):
为什么不在where子句中过滤掉空记录呢?我认为,您的第二个选项甚至不会运行,因为
B
alias在查询中的该点不可用。@TimBiegeleisen。你是对的。获取错误“无法绑定多部分标识符“B.takenby”。严重性16“不工作”。再次尝试使用这两个答案,我得到每个id的两行,一行为null,另一行为逗号分隔值。我没有得到错误。问题就像我只希望在结束表中有唯一的行,但您的查询显示了两个相同id的行,一个为Null,另一个为逗号分隔的值。我只想要一排,谢谢。它工作得很好。但为什么在某些结果中它显示逗号分隔的值,而某些结果具有单个值。它的计算依据是什么?您将看到的值是具有该bpm_referenceno的winame RCO的记录,因为这是stuff select中的过滤器。当您只看到1个值时,这意味着只有1条记录具有RCO。太好了,谢谢!我又发了一个问题。你能帮忙吗。这里的链接:@MDKAMRANAzam,为什么它不起作用。试试吧。它很好用。
ALTER VIEW BM_RLOS_VW_RCO_AUTH
AS
SELECT DISTINCT
A.bpm_referenceno AS ref_no,
STUFF(
(
SELECT
', '+B.takenby
FROM
BM_RLOS_DecisionHistoryForm B
WHERE
B.winame ='RCO' AND
A.bpm_referenceno = B.bpm_referenceno
FOR XML
PATH(''),Type
).value('.','nvarchar(max)')
,1,2,'') takenby
FROM
BM_RLOS_DecisionHistoryForm A