为啥仅通过更改 SELECT 子句就可以得到零行或具有 NULL 值的行?

Posted

技术标签:

【中文标题】为啥仅通过更改 SELECT 子句就可以得到零行或具有 NULL 值的行?【英文标题】:Why do I get either zero rows or a row with a NULL value, just by changing the SELECT clause?为什么仅通过更改 SELECT 子句就可以得到零行或具有 NULL 值的行? 【发布时间】:2011-05-02 14:55:47 【问题描述】:

我刚才碰到了一个意想不到的东西,它提醒我对SQL还有很多我不知道的地方。

我有一个报告查询,它使用UNION ALL 连接不同日期范围的结果,并将它们以 html 形式存储在临时表中。该查询今天为 MTD 范围提供了 NULL 值,因为 1 日没有活动。我不明白的是:为什么我得到任何行?玩弄查询,我看到这个片段:

SELECT
    70000,
    '<tr>' + dbo.FormatAsHTMLRowHead('Month to date') + '</tr>'
FROM
    #RawResults
WHERE
    Date = '2011-05-01'

...没有结果,零行,正如预期的那样。但是,如果我在 SELECT 子句中添加一个字段:

SELECT
    70000,
    '<tr>'
    + dbo.FormatAsHTMLRowHead('Month to date')
    + dbo.FormatAsHTMLCell(dbo.FormatInteger(SUM(Leads)), 'R')
    + '</tr>'
FROM
    #RawResults
WHERE
    Date = '2011-05-01'

然后我得到一个 NULL 值的单行:

Sequence HTML
-------- ----
70000    NULL

查询SELECT Field FROM #RawResults WHERE Date = '2011-05-01' 不会返回任何结果,因此即使WHERE 子句中没有匹配值,对非文字进行操作的UDF 似乎也会导致SQL 返回一行。这是一些奇怪的边缘情况,还是因为今天早上让我无法理解的某种原因,这完全合理?

【问题讨论】:

【参考方案1】:

第二个有一个没有 GROUP BY 的聚合 SUM = 总是返回一行

在这里查看我的答案:Does COUNT(*) always return a result?

【讨论】:

知道了,我被 UDF 分心了,但 SUM() 是问题所在。谢谢!

以上是关于为啥仅通过更改 SELECT 子句就可以得到零行或具有 NULL 值的行?的主要内容,如果未能解决你的问题,请参考以下文章

为啥select 子句中的字段一定要出现在Groupby子句中

J-Scope

为啥聚集函数不能出现在where子句中

为啥 SQL 强制我在 GROUP BY 子句中重复 SELECT 子句中的所有非聚合字段? [关闭]

MySQL必知应会-第24章-使用游标

UPDATE 查询更改了没有 WHERE 子句但有 AND 子句的行 - 为啥?