COALESCE在PostgreSQL中不起作用

时间:2015-06-04 12:22:23

标签: postgresql

当我执行以下代码时:

CREATE TABLE Unsubscriptions (
    Email varchar(80) NOT NULL PRIMARY KEY,
    Unsubscribed boolean NOT NULL
);
SELECT COALESCE(Unsubscribed, FALSE) FROM Unsubscriptions WHERE Email = 'nnn';

我希望select永远不会返回NULL值,因为根据PostgreSQL docs有COALESCE操作从参数返回第一个NON-NULL值(在这种情况下为FALSE)。

但是,在我的Amazon RDS实例上,即使表中没有条目,上面的代码仍会返回NULL,但它应该采用第二个参数。

为什么COALESCE函数不返回FALSE值?

3 个答案:

答案 0 :(得分:3)

我认为这是你误解的关键:

  

仍然返回NULL,即使表中没有条目

如果表中没有行,则简单SELECT的输出中不会有行。 COALESCE更改特定列中特定行的值,但不能创建额外的行。

正如其他人所指出的那样,表中 的任何行都被约束为NOT NULL,因此COALESCE不会产生任何影响。

您可能会看到在您查询数据的应用程序中的空集,导致行为类似于其中包含NULL的行为。请注意,具有零行的SQL结果集仍将具有名称甚至类型的列(将它们视为空网格的标题)。

如果你想保证你总是至少有一行,你或许可以在结果上UNION一个虚拟行:

SELECT Unsubscribed FROM Unsubscriptions WHERE Email = 'nnn'
UNION
SELECT false as Unsubscribed

这个虚拟行和任何实际结果都会存在,如果有的话,如果你没有在应用程序代码中跳过它的麻烦,你需要一个更聪明的解决方案。

答案 1 :(得分:1)

根据您的帖子UnsubscribedNOT NULL列,如下所示,根本没有必要使用COALESCE()功能。至少我没有看到。

Unsubscribed boolean NOT NULL

NULL和空行是两个不同的东西。此外,如果您的表为空,则where条件WHERE Id = 'nnn'将永远不会满足,因此不会返回任何行。即使你做一个简单的select结果也是空的结果集。如果列标记为NOT NULL,那么您永远不能在那里输入NULL值,因此无法获得NULL

答案 2 :(得分:0)

这项工作

SELECT COALESCE((SELECT Unsubscribed FROM Unsubscriptions WHERE Email = 'nnn'), false)