繁体   English   中英

MySQL PDO WHERE语句中为NULL

[英]NULL in MySQL PDO WHERE statement

$id可以但不一定是NULL 除了使用PHP测试$idNULL ,并将查询更改为IS NULL ,如何执行此查询?

$stmt = $db->prepare("SELECT * FROM t WHERE id=?");
$stmt->execute([$id]);
return $stmt->fetchAll();

根据https://stackoverflow.com/a/1391801/1032531 ,我尝试了bindValue(':id', null, PDO::PARAM_INT); ,但得到错误Fatal error: Cannot pass parameter 2 by reference

我也试过$stmt->bindParam(':id', $id, PDO::PARAM_NULL); 虽然没有错误,但我没有得到任何结果。

您正在寻找的是ANSI标准IS NOT DISTINCT FROM运算符。 对于NULL IS NOT DISTINCT FROM NULL返回true。

MySQL使用<=>比较运算符支持此功能。 所以你可以使用:

SELECT *
FROM t
WHERE id <=> ?

这假设您在与NULL进行比较时实际上想要id NULL值。 通常,如果参数为NULL ,则所需的逻辑是获取所有行:

WHERE id = ? OR (? IS NULL)

要么:

WHERE id = COALESCE(?, id)

正如您所注意到的,SQL中的null s不是值,并且不能使用=运算符进行求值,但必须使用is运算符进行专门处理。 一次性完成此操作的一种巧妙方法是一次使用两个条件,一个处理null s,另一个处理实际值:

$stmt = $db->prepare("SELECT * FROM t WHERE id=? OR (id IS NULL AND ? IS NULL");
$stmt->execute([$id, $id]);
return $stmt->fetchAll();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM