Heim > Fragen und Antworten > Hauptteil
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?
P粉7606754522023-10-25 09:10:31
问:MySQL临时变量可以在WHERE子句中使用吗?
是的。 MySQL 用户定义的变量(例如 @var
)可以在 WHERE 子句中引用。
用户定义的变量是对当前在计算表达式时分配给它的任何值的引用。
在查询中,WHERE 子句中的谓词先于 SELECT 列表中的表达式进行计算。
也就是说,在访问行时,@var < 10
将被计算为布尔表达式;对于每个候选行,都会计算表达式,并且仅当结果为 TRUE 时才返回该行。
如果您要为该变量提供一个数值大于或等于 10 的值,则在执行该语句之前,将返回所有行。
问:如何根据@var
的值过滤结果?
你真的不能。 (实际上,这就是您的原始查询正在执行的操作。)
您可以在 @var
之外的其他表达式中包含谓词;这些表达式可以从分配给 @var
的值派生出来。
作为一种选择,您可以在 SELECT 列表中返回一个表达式,然后使用 HAVING
子句来过滤返回的行。 (注意:HAVING
子句在结果集准备好之后进行计算;与 WHERE
子句不同,后者在访问行时进行计算。 )
另一种选择是使用内联视图来准备结果集,然后外部查询可以在返回的表达式上使用 WHERE 子句。
但严格来说,这些方法都对 @var
以外的表达式应用谓词;他们实际上并没有对 @var
中的值进行测试。
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