Maison > Questions et réponses > le corps du texte
Dans MySQL, les variables temporaires peuvent-elles être utilisées dans la clause WHERE
?
Par exemple, dans la requête suivante :
SELECT `id`, @var := `id` * 2 FROM `user`
@var a été défini avec succès sur deux fois la valeur de `id`
Cependant, si j'essaie de filtrer l'ensemble de résultats pour inclure uniquement les résultats où @var est inférieur à 10 :
SELECT `id`, @var := `id` * 2 FROM `user` WHERE @var < 10
Ensuite, je n'ai obtenu aucun résultat.
Comment filtrer les résultats en fonction de la valeur de @var ?
P粉7606754522023-10-25 09:10:31
Q : Les variables temporaires MySQL peuvent-elles être utilisées dans la clause WHERE ?
Oui. Les variables MySQL définies par l'utilisateur (telles que @var
) peuvent être référencées dans la clause WHERE.
Une variable définie par l'utilisateur est une référence à la valeur qui lui est actuellement attribuée lorsque l'expression est évaluée.
Dans une requête, les prédicats de la clause WHERE sont évalués avant les expressions de la liste SELECT.
C'est-à-dire que lors de l'accès à une ligne, @var < 10
sera évaluée comme une expression booléenne ; pour chaque ligne candidate, l'expression est évaluée et la ligne n'est renvoyée que si le résultat est VRAI.
Si vous deviez fournir à cette variable une valeur numérique supérieure ou égale à 10, toutes les lignes seraient renvoyées avant d'exécuter l'instruction.
Q : Comment filtrer les résultats en fonction de la valeur de @var
?
Vous ne pouvez vraiment pas. (En fait, c'est ce que fait votre requête d'origine.)
Vous pouvez inclure des prédicats dans des expressions autres que @var
之外的其他表达式中包含谓词;这些表达式可以从分配给 @var
; ces expressions peuvent être dérivées de la valeur attribuée à
HAVING
子句来过滤返回的行。 (注意:HAVING
子句在结果集准备好之后进行计算;与 WHERE
En option, vous pouvez renvoyer une expression dans la liste SELECT, puis utiliser une autre clause
Une autre option consiste à utiliser une vue en ligne pour préparer le jeu de résultats, puis la requête externe peut utiliser une clause WHERE sur l'expression renvoyée.
@var
以外的表达式应用谓词;他们实际上并没有对 @var
Mais à proprement parler, ces méthodes appliquent toutes des prédicats à des expressions autres que
P粉5305192342023-10-25 00:42:47
Vous devez attribuer un alias et le tester dans la clause HAVING
:
SELECT id, @var := id * 2 AS id_times_2 FROM user HAVING id_times_2 < 10
Notez que si vous utilisez simplement une formule pour filtrer, plutôt que de transmettre les résultats internes d'une ligne à la suivante, vous n'avez pas du tout besoin de cette variable. Vous pouvez écrire :
SELECT id, id * 2 AS id_times_2 FROM user HAVING id_times_2 < 10