在MySQL中,可以在WHERE
子句中使用临时变量吗?
例如,在以下查询中:
SELECT `id`, @var := `id` * 2 FROM `user`
@var成功设置为`id`
值的两倍但是,如果我尝试将结果集过滤为仅包含@var小于10的结果:
SELECT `id`, @var := `id` * 2 FROM `user` WHERE @var < 10
然后我没有结果。
如何根据@var?
的值过滤结果答案 0 :(得分:13)
您需要分配别名,并在HAVING
子句中对其进行测试:
SELECT id, @var := id * 2 AS id_times_2
FROM user
HAVING id_times_2 < 10
请注意,如果您只是使用公式进行过滤,而不是将内部结果从一行传递到下一行,则根本不需要变量。你可以写:
SELECT id, id * 2 AS id_times_2
FROM user
HAVING id_times_2 < 10
答案 1 :(得分:2)
问:MySQL临时变量可以在WHERE子句中使用吗?
是。 MySQL用户定义的变量(例如@var
)可以在WHERE子句中引用。
用户定义的变量是对当前分配给它的任何值的引用表达式的计算。
在查询中,在 SELECT列表中的表达式之前,对WHERE子句中的谓词进行计算。
也就是说, @var < 10
在访问行时被计算为布尔表达式;对于每个候选行,将计算表达式,并且仅当结果为TRUE时才返回该行。
如果要为数字值大于或等于10的变量提供值,则在执行语句之前,将返回所有行。
问:如何根据@var
的值过滤结果?
你不能真的。 (实际上,这就是你的原始查询正在做的事情。)
您可以在其他而不是@var
的表达式中包含谓词;这些表达式可以从分配给@var
的值中派生。
作为一个选项,您可以在SELECT列表中返回一个表达式,然后使用HAVING
子句来过滤返回的行。 (注意:{<1}}子句在结束集准备好之后进行评估;与HAVING
子句不同,后者是在访问行时计算的。)
另一种方法是使用内联视图来准备结果集,然后外部查询可以对返回的表达式使用WHERE子句。
但严格地说,那些方法都是在表达式其他而不是WHERE
上应用谓词;他们实际上并没有对@var
中的值进行测试。