可以在WHERE子句中使用MySQL临时变量吗?

时间:2014-07-07 17:28:57

标签: mysql variables where where-clause temporary

在MySQL中,可以在WHERE子句中使用临时变量吗?

例如,在以下查询中:

SELECT `id`, @var := `id` * 2 FROM `user`

@var成功设置为`id`

值的两倍

但是,如果我尝试将结果集过滤为仅包含@var小于10的结果:

SELECT `id`, @var := `id` * 2 FROM `user` WHERE @var < 10

然后我没有结果。

如何根据@var?

的值过滤结果

2 个答案:

答案 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中的值进行测试。