Können in MySQL temporäre Variablen in WHERE
Klausel verwendet werden?
Zum Beispiel in der folgenden Abfrage:
SELECT `id`, @var := `id` * 2 FROM `user`
@var wurde erfolgreich auf den doppelten Wert von „id“ gesetzt
Wenn ich jedoch versuche, die Ergebnismenge so zu filtern, dass sie nur Ergebnisse enthält, bei denen @var kleiner als 10 ist:
SELECT `id`, @var := `id` * 2 FROM `user` WHERE @var < 10
Dann habe ich keine Ergebnisse erhalten.
Wie filtere ich Ergebnisse basierend auf dem Wert von @var?
问:MySQL临时变量可以在WHERE子句中使用吗?
是的。 MySQL 用户定义的变量(例如
@var
)可以在 WHERE 子句中引用。用户定义的变量是对当前在计算表达式时分配给它的任何值的引用。
在查询中,WHERE 子句中的谓词先于 SELECT 列表中的表达式进行计算。
也就是说,在访问行时,
@var
将被计算为布尔表达式;对于每个候选行,都会计算表达式,并且仅当结果为 TRUE 时才返回该行。如果您要为该变量提供一个数值大于或等于 10 的值,则在执行该语句之前,将返回所有行。
问:如何根据
@var
的值过滤结果?你真的不能。 (实际上,这就是您的原始查询正在执行的操作。)
您可以在
@var
之外的其他表达式中包含谓词;这些表达式可以从分配给@var
的值派生出来。作为一种选择,您可以在 SELECT 列表中返回一个表达式,然后使用
HAVING
子句来过滤返回的行。 (注意:HAVING
子句在结果集准备好之后进行计算;与WHERE
子句不同,后者在访问行时进行计算。 )另一种选择是使用内联视图来准备结果集,然后外部查询可以在返回的表达式上使用 WHERE 子句。
但严格来说,这些方法都对
@var
以外的表达式应用谓词;他们实际上并没有对@var
中的值进行测试。您需要分配一个别名,并在
HAVING
子句中测试它:请注意,如果您只是使用公式进行过滤,而不是将内部结果从一行传递到下一行,则根本不需要该变量。你可以写: