Mysql PostgreSQL中的IFNULL()等价项
我正在做一个从MySQL迁移到PostgreSQL的项目,有些函数在PostgreSQL中不能很好地工作,比如Mysql PostgreSQL中的IFNULL()等价项,mysql,postgresql,database-migration,ifnull,nullif,Mysql,Postgresql,Database Migration,Ifnull,Nullif,我正在做一个从MySQL迁移到PostgreSQL的项目,有些函数在PostgreSQL中不能很好地工作,比如IFNULLfunction。一些教程说,在PostgreSQL中,我们可以使用NULLIF来处理它。 当我尝试时,我遇到了一个问题“的参数NOT必须是boolean类型,而不是integer类型” 这是一个简单的SQL: SELECT * FROM `tableA` WHERE not(nullif(columnA, 0)); 如何解决?也许有人可以解释一下它是如何工作的。谢谢NUL
IFNULL
function。一些教程说,在PostgreSQL中,我们可以使用NULLIF
来处理它。
当我尝试时,我遇到了一个问题“的参数NOT必须是boolean类型,而不是integer类型
”
这是一个简单的SQL:
SELECT * FROM `tableA` WHERE not(nullif(columnA, 0));
如何解决?也许有人可以解释一下它是如何工作的。谢谢NULLIF()与IFNULL()非常不同。我认为您需要的是COALESCE(),它将返回第一个非NULL参数(它可以有两个以上的参数):
参考:
此外,在Postgres中,您需要使用true
或false
。0和1不适用于布尔文字。这就是您出现错误的原因:
NOT的参数必须是boolean类型,而不是integer类型
如果
列a
是一个整数,则必须将其强制转换为布尔值。这就是上面示例中的列a::boolean
所做的。它相当于CAST(列a为布尔值)
nullif在两个参数相等时返回null,否则将返回给定的第一个参数。您的“not(nullif(columnA,0))”将被评估为“not(null)”或“not(columnA)”,这并不是您的意思。感谢@Stacking For Heap,我终于可以理解它是如何工作的。太好了,请接受我的建议answer@laurenz-虽然这正是我写的如果你读我的答案,还有OP。OP正在寻找一个类似于IFNULL()
Thank@isapir的函数,你的答案正是我需要的。当我按照您所说的进行尝试时,我可以看到不同之处,特别是脚本执行时的持续时间。
SELECT *
FROM table_a
WHERE NOT (COALESCE(column_a::boolean, false));