mysql - 在 MySQL WHERE 中设置和使用变量

标签 mysql

如果我在 MySQL 5.7.16 上执行以下查询,则结果集包含一行值为 2,这是预期的:

SELECT *
FROM (SELECT 1 as x UNION SELECT 2 UNION SELECT 3) AS t
WHERE ( 2 IS NULL OR t.x = 2 )
;
-- Resultset: 1 row, x = 2

现在,我想在准备好的语句中使用这个逻辑,比如 ? IS NULL 或 t.x = ?。所以你看到同一个参数出现了两次。因此,我应用了在 SO 上找到的建议(我不记得确切位置):将参数放在 MySQL session 变量中,然后使用它:

SELECT *
FROM (SELECT 1 as x UNION SELECT 2 UNION SELECT 3) AS t
WHERE ( (@x := 2) IS NULL OR t.x = @x )
;
-- Resultset: 0 row

但这失败了:没有行被返回。当我还选择 @x 变量时,为了查看发生了什么,我得到了 @xNULL 值:

SELECT @x
FROM (SELECT 1 as x UNION SELECT 2 UNION SELECT 3) AS t
WHERE ( (@x := 2) IS NULL OR t.x = 2 )
;
-- Resultset: 1 row, @x = NULL

所以看起来变量在放入WHERE时似乎没有设置?到底是怎么回事?

我可以创建一个 INNER JOIN (SELECT 2 AS x) AS params 并在 WHERE 中使用 params.x,但我会想了解 WHERE ( (@x = 2) IS NULL OR t.x = @x ) 中发生了什么。

最佳答案

这里发生的是 WHERE 中的执行顺序是任意。这意味着使用

(@x := 2) IS NULL OR t.x = 2

无法保证 @x := 2 将首先执行。

要正确初始化变量,请使用CROSS JOIN:

SELECT *
FROM (SELECT 1 as x UNION SELECT 2 UNION SELECT 3) AS t
CROSS JOIN (SELECT @x := 2) AS v
WHERE ( @x IS NULL OR t.x = @x )

关于mysql - 在 MySQL WHERE 中设置和使用变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44020712/

相关文章:

php - 如何在php中显示用户信息?

来自 SSH 的 MYSQL 用户设置权限主机

mysql - Access MySQL 或 Postgres?

GROUP_CONCAT() 上的 MySQL DISTINCT

mysql - 我们可以在插入语句中设置排序规则吗?

mysql - 报告所有可能的列组合

php - MySQL & PHP 小数精度错误

mysql。函数 ROUND 没有给出正确的值

mysql - 带有 Rest 服务的 Web 应用程序

MySQL 活字记录