$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
进行比较时确实希望NULL
id
的值。 通常,所需的逻辑是在参数NULL
时取所有行:
WHERE id = ? OR (? IS NULL)
或:
WHERE id = COALESCE(?, id)
正如你所注意到的,SQL 中的null
不是值,不能用=
运算符计算,而必须用is
运算符专门解决。一次完成此操作的一种巧妙方法是同时使用两个条件,一个处理null
,另一个处理实际值:
$stmt = $db->prepare("SELECT * FROM t WHERE id=? OR (id IS NULL AND ? IS NULL");
$stmt->execute([$id, $id]);
return $stmt->fetchAll();