[英]NULL in MySQL PDO WHERE statement
$id
可以但不一定是NULL
。 除了使用PHP测试$id
为NULL
,并将查询更改为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.