作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如果我在 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
变量时,为了查看发生了什么,我得到了 @x
的 NULL
值:
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/
我是一名优秀的程序员,十分优秀!