【问题标题】:IFNULL() Equivalent in PostgreSQLIFNULL() 等价于 PostgreSQL
【发布时间】:2018-08-09 02:17:21
【问题描述】:

我正在做一个从 MySQL 迁移到 PostgreSQL 的项目,一些函数在 PostgreSQL 中不能很好地工作,比如 IFNULL 函数。一些教程说在 PostgreSQL 中我们可以使用NULLIF 来处理它。 当我尝试时,我遇到了一个问题“argument of NOT must be type boolean, not type integer”。

这是简单的 SQL:

SELECT * FROM `tableA` WHERE not(nullif(columnA, 0));

如何解决?也许有人可以解释它如何运作良好。谢谢

【问题讨论】:

  • nullif 当你的两个参数相等时返回 null,否则,它将返回给定的第一个参数。您的“not(nullif(columnA, 0))”将被评估为“not(null)”或“not(columnA)”,这几乎不是您的意思。
  • 感谢@Stacking For Heap,我终于明白它是如何工作的了。
  • 很好,请接受我的回答

标签: mysql sql postgresql ifnull nullif


【解决方案1】:

NULLIF() 与 IFNULL() 非常不同。我认为你想要的是 COALESCE(),它将返回第一个非 NULL 参数(它可以有 2 个以上的参数):

SELECT * 
FROM   table_a
WHERE  NOT (COALESCE(column_a::boolean, false));

参考:9.17.2. COALESCE

此外,在 Postgres 中,您需要使用 truefalse。 0 和 1 不适用于布尔文字。这就是您收到错误的原因:

NOT 的参数必须是布尔类型,而不是整数类型

如果column_a 是一个整数,那么你必须将它转换为boolean。这就是上面示例中的column_a::boolean 所做的。相当于CAST(column_a AS boolean)

【讨论】:

  • @laurenz-albe 如果您重新阅读我的答案和 OP,这正是我所写的。 OP 正在寻找与IFNULL() 相当的功能
  • 感谢@isapir,您的回答正是我所需要的。当我按照您所说的进行尝试时,我可以看到不同之处,尤其是关于脚本执行的持续时间。
猜你喜欢
  • 2010-10-22
  • 2012-03-26
  • 2022-06-10
  • 2011-02-28
  • 2023-04-11
  • 2014-04-14
  • 1970-01-01
  • 2011-01-13
  • 1970-01-01
相关资源
最近更新 更多