首页  >  问答  >  正文

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

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

例如,在以下查询中:

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

@var 已成功设置为 `id` 值的两倍

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

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

然后我没有得到任何结果。

如何根据@var的值过滤结果?

P粉798343415P粉798343415361 天前559

全部回复(2)我来回复

  • P粉760675452

    P粉7606754522023-10-25 09:10:31

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

    是的。 MySQL 用户定义的变量(例如 @var)可以在 WHERE 子句中引用。

    用户定义的变量是对当前在计算表达式时分配给它的任何值的引用。

    在查询中,WHERE 子句中的谓词先于 SELECT 列表中的表达式进行计算。

    也就是说,在访问行时,@var < 10< 10 将被计算为布尔表达式;对于每个候选行,都会计算表达式,并且仅当结果为 TRUE 时才返回该行。

    如果您要为该变量提供一个数值大于或等于 10 的值,则在执行该语句之前,将返回所有行。

    问:如何根据@var的值过滤结果?

    你真的不能。 (实际上,这就是您的原始查询正在执行的操作。)

    您可以在 @var 之外的其他表达式中包含谓词;这些表达式可以从分配给 @var 的值派生出来。

    作为一种选择,您可以在 SELECT 列表中返回一个表达式,然后使用 HAVING 子句来过滤返回的行。 (注意:HAVING 子句在结果集准备好之后进行计算;与 WHERE 子句不同,后者在访问行时进行计算。 )

    另一种选择是使用内联视图来准备结果集,然后外部查询可以在返回的表达式上使用 WHERE 子句。

    但严格来说,这些方法都对 @var 以外的表达式应用谓词;他们实际上并没有对 @var 中的值进行测试。

    回复
    0
  • P粉530519234

    P粉5305192342023-10-25 00:42:47

    您需要分配一个别名,并在 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

    回复
    0
  • 取消回复