当我执行以下代码时:
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值?
答案 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)
根据您的帖子Unsubscribed
是NOT 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)