use*_*002 1 sql t-sql sql-server
我之前被一个 coalesce-returns-null 问题所困扰,这个问题涵盖在这个https://dba.stackexchange.com/questions/165295/why-coalesce-within-a-subquery-returns-null 中。
为了提高我的理解,我想要一个更简单的例子:
create table tbl(col int);
Run Code Online (Sandbox Code Playgroud)
然后
SELECT col
FROM tbl
-- returns nothing of course, tbl is empty
Run Code Online (Sandbox Code Playgroud)
所以在下面的代码中,coalesce没有什么可以合并的,所以它应该不返回任何东西(没有结果集),或者可能是一个空值。
select coalesce(
(
SELECT col
FROM tbl
), 22)
Run Code Online (Sandbox Code Playgroud)
但是运行它,我得到 22。为什么它在我认为不应该工作的时候工作?
(在 SQL Server/TSQL 中测试)
在这个查询中:
select coalesce( (SELECT col FROM tbl), 22)
-----------------^ subquery
Run Code Online (Sandbox Code Playgroud)
子查询是一个标量子查询。也就是说,它被用来代替常量。标量子查询具有以下属性:
NULL。其中的第三个就是为什么你会NULL如此COALESCE()返回第二个参数。
请注意,如果tbl有多于一行,那么您会收到一个错误,大概是“标量子查询返回多于一行”的形式。即使 中的值col2都是NULL.