MySQL:当某些东西与NULL相等时会发生什么?

时间:2016-04-18 23:37:34

标签: php mysql sql null

我的查询中有CASE WHEN个函数。像这样:

CASE WHEN h.user_id = :user_id THEN '1' 
     ELSE '0'
END paid

我这样通过:user_id

$sth->bindValue(":user_id", $user_id, PDO::PARAM_INT);

好吧,有时$user_idNULL。我已经听说在查询中某些内容与NULL相等时,会发生一些不好的事情。现在我想知道,当$user_idNULL时会发生什么?

我测试了它,但一切都很好,我没有看到任何问题。当$user_idNULL时,$result['paid']1CASE..WHEN是否会中断?

修改

我希望在h.user_id = :user_id然后paid = 1时执行此操作。但有时候:user_idnull。我怎么能逃脱null

2 个答案:

答案 0 :(得分:6)

您遇到的问题是,根据标准,将任何内容与 null 进行比较会得到 null 的结果,最终被强迫 false 。因此,当0:user_id h.user_id 时,您的表达式将始终返回null

幸运的是,这种情况经常出现,MySQL提供了一些名为"spaceship" or "NULL-safe equal" operator的语法糖,看起来像<=>。它与普通=运算符完全相同,只是在比较 false (不是 null )比较两个 {{1}时> null 指向非 null true }

表达式变为

null

答案 1 :(得分:1)

如果传递的参数确实是一个空值,那么case表达式的结果应该是0,因为null不会与任何字段值相等,所以else分支必须启动。没有必要转义空值。

为了使用PDO将空值从php正确传递到mysql,请参阅this SO topic