我的查询中有一个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呢?
发布于 2016-04-19 00:03:39
您遇到的问题是,根据标准,将任何东西与null进行比较都会得到null,的结果,最终会被胁迫到false.因此,当null.或h.user_id为:user_id时,您的表达式将始终返回:user_id或h.user_id。
幸运的是,这种情况经常出现,以至于MySQL提供了一些名为-safe equal" operator的语法糖,类似于<=>。它的用法与普通的=运算符完全一样,只是它返回false (当比较null与non-null,时不返回true,在比较两个null.时返回true)。
然后这个表达式变成
CASE WHEN h.user_id <=> :user_id THEN '1'
ELSE '0'
END paid发布于 2016-04-19 00:04:06
如果传递的参数确实是null值,那么case表达式的结果应该是0,因为null与任何字段值都不相等,所以else分支必须启动。没有必要转义空值。
为了使用PDO将null值从php适当地传递给mysql,请参阅this SO topic
https://stackoverflow.com/questions/36706075
复制相似问题