Sql 如何在Stuff函数中包含空值?

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

我正在使用一个表开发一个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.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