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 进行比较时确实希望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();

相关内容

  • 没有找到相关文章

最新更新