SQL-查询中的条件ISNULL语句

时间:2019-04-01 14:26:07

标签: sql-server

我正在使用以下查询来收集有关每个ProductId的一些信息-请注意,ProductId可以在dbo.Sales表中包含多个记录:

SELECT 
c.ProductId, 
COUNT(*) as NumberOfRecords,
(SELECT
 (ISNULL(NULLIF(c.Text, ''), 'FALSE'))) as TextFieldHasData
FROM dbo.Sales c
JOIN dbo.Sources s 
ON c.ProductId = s.ProductId
AND s.SourceStatusId in (1,2)
GROUP BY c.ProductId, c.Status, s.SourceStatusId, c.Text
ORDER BY c.ProductId

我需要调整查询的ISNULL部分,并且语法有麻烦;我真正需要做的是首先检查NumberofRecords计数-如果给定结果记录的NumberofRecords计数大于1,则该记录的TextFieldHadData字段应只显示“不适用”。但是,如果给定结果记录的NumberofRecords计数= 1,则它应检查c.Text字段是NULL还是空白。如果 NULL或空白,则TextFieldHasData字段将显示“ FALSE”。如果为 NULL或空白,则TextFieldHasData字段将显示为“ TRUE”。

2 个答案:

答案 0 :(得分:2)

查看您的代码,也许您正在寻找类似以下内容的东西(您将在其中分组到ProductId级别):

SELECT 
    c.ProductId
    , COUNT(*) as NumberOfRecords
    ,
        CASE
            WHEN COUNT(*) > 1
            THEN 'N/A'
            ELSE
                CASE
                    WHEN SUM(CASE WHEN ISNULL(c.Text, '') = '' THEN 0 ELSE 1 END) > 0
                    THEN 'TRUE'
                    ELSE 'FALSE'
                END
        END TextFieldHasData
FROM
    dbo.Sales c
    JOIN dbo.Sources s ON
        c.ProductId = s.ProductId
        AND s.SourceStatusId in (1, 2)
GROUP BY c.ProductId
ORDER BY c.ProductId

答案 1 :(得分:0)

您可以使用查询:

我无法验证它,因为我没有这些表,但是它应该可以工作,除非您发现较小的语法错误。

这个想法是使用“ case when ... ” sql函数

select v.productid,v.NumberOfRecords,
case
       when v.NumberOfRecords>1 then 'N/A'
       when v.NumberOfRecords=1 and isnull(v.TextFieldHasData,'') ='' then 'FALSE'
       else 'TRUE' end [textfieldhasdata]

 from(
SELECT 
c.ProductId, 
COUNT(*) as NumberOfRecords,
(SELECT
 (ISNULL(NULLIF(c.Text, ''), 'FALSE'))) as TextFieldHasData
FROM dbo.Sales c
JOIN dbo.Sources s 
ON c.ProductId = s.ProductId
AND s.SourceStatusId in (1,2)
GROUP BY c.ProductId, c.Status, s.SourceStatusId, c.Text) v
ORDER BY ProductId