Können temporäre MySQL-Variablen in der WHERE-Klausel verwendet werden?
P粉798343415
P粉798343415 2023-10-24 10:37:42
0
2
584

Können in MySQL temporäre Variablen in WHEREKlausel 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粉798343415
P粉798343415

Antworte allen(2)
P粉760675452

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

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

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

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

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

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

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

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

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

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

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

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

P粉530519234

您需要分配一个别名,并在 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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage