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