为啥仅通过更改 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子句中