我的查询中有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_id
是NULL
。我已经听说在查询中某些内容与NULL
相等时,会发生一些不好的事情。现在我想知道,当$user_id
为NULL
时会发生什么?
我测试了它,但一切都很好,我没有看到任何问题。当$user_id
为NULL
时,$result['paid']
为1
或CASE..WHEN
是否会中断?
修改
我希望在h.user_id = :user_id
然后paid = 1
时执行此操作。但有时候:user_id
是null
。我怎么能逃脱null
?
答案 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