子查询中的COALESCE仍返回DBnull

Jam*_*mie 2 sql sql-server coalesce

不幸的是,我今天面临着另一个我不理解的错误。我正在从数据库中选择下一个和上一个ID,并且我正在使用COALESCE用数字替换空值。但是由于某种原因它仍然返回null,我缺少什么吗?

"Select Gags.Title, Gags.DatePosted, Gags.Image, Users.Username, (Select Top(1) COALESCE(Id, 0) from Gags where Id > " + IdModel.Id + "), (Select Top(1) COALESCE(Id, 0) from Gags where Id < " + IdModel.Id + ") From Gags Inner Join Users on Gags.Userid = Users.Id where Gags.Id = " + IdModel.Id + "
Run Code Online (Sandbox Code Playgroud)

固定查询:

Select Gags.Title, Gags.DatePosted, Gags.Image, Users.Username, isnull((Select Top(1) id from Gags where Id > " + IdModel.Id + "),-1), Isnull((Select Top(1) id from Gags where Id < " + IdModel.Id + "), -1) From Gags Inner Join Users on Gags.Userid = Users.Id where Gags.Id = " + IdModel.Id + "
Run Code Online (Sandbox Code Playgroud)

我说的是两个子查询。

提前致谢!

今天是糟糕的编程日。

And*_*mar 5

对于空行集,coalesce将不会调用:

(select top 1 coalesce(Id, 0) from ...)
Run Code Online (Sandbox Code Playgroud)

标量上下文中的空行集将返回null

select (select 1 where 1=0)
-->
NULL
Run Code Online (Sandbox Code Playgroud)

一种解决方案是将coalesce子查询移到外部:

coalesce((select top 1 Id from ...),0)
Run Code Online (Sandbox Code Playgroud)

  • @Andomar。。。需要注意的是,这是您*不应*使用`coalesce()`的地方(否则我总是主张)。显然,SQL Server(或至少某些版本)中存在一个错误,当值不为NULL时,会导致两次执行coalesce()的第一个参数两次。由于这个原因,在这里首选`isnull()`。以下是更多详细信息:http://www.mssqltips.com/sqlservertip/2689/deciding-between-coalesce-and-isnull-in-sql-server/。 (4认同)