pouvez MySQL variables temporaires être utilisée dans la clause where?
Dans MySQL, peut variables temporaires être utilisé dans le WHERE
clause?
Par exemple, la requête suivante:
SELECT `id`, @var := `id` * 2 FROM `user`
@var est définie avec succès à deux fois la valeur de "id"
Cependant, si j'essaie de filtrer le résultat de n'inclure que les résultats @var est à moins de 10:
SELECT `id`, @var := `id` * 2 FROM `user` WHERE @var < 10
puis-je obtenir aucun résultat.
Comment puis-je filtrer les résultats en fonction de la valeur de @var?
SELECT id, @var := id * 2 FROM user WHERE id < 5
? (Désolé, pas pu résister...)Rien déclaré dans le
SELECT
clause ne peut être référencé dans HAVING
. WHERE
peut accéder uniquement aux données de la table.Haha, merci. Cependant, je suis à la recherche d'un moyen de filtrer sur les variables temporaires, pas de colonnes de la table. Dans la réalité de notre requêtes, la valeur de @var est basé sur une logique plus compliquée, et il serait superflu de répéter la logique dans les deux
SELECT
et WHERE
clauses.La requête suivante ne fonctionne pas:
SELECT `id`, @var := `id` * 2 FROM `user` HAVING @var < 10
OriginalL'auteur Leo Galleguillos | 2014-07-07
Vous devez vous connecter pour publier un commentaire.
Vous devez affecter un alias, et de le tester dans la
HAVING
clause:Noter que si vous êtes juste en utilisant la formule pour le filtrage, pas pour la communication interne des résultats à partir d'une ligne à l'autre, vous n'avez pas besoin de la variable. Vous pouvez écrire:
Strictement parlant, le prédicat de la clause HAVING est pas "basé sur la valeur de var @". Notez que l'affectation de la variable définie par l'utilisateur
@var :=
pourrait être retiré de la déclaration, et le résultat serait exactement le même. (La différence serait de l'assignation d'une valeur à la variable définie par l'utilisateur, qui serait déterminé à partir de la dernière ligne de traitement.)Bon point, j'ai ajouté une requête qui n'utilise pas la variable. Variables utilisateur sont généralement seulement besoin de passer des valeurs entre les lignes, comme des cumuls ligne compteurs, etc.
OriginalL'auteur Barmar
Q: puis-MySQL variables temporaires être utilisée dans la clause where?
Oui. MySQL variables définies par l'utilisateur (par exemple,
@var
) peut être référencé dans une clause where.La variable définie par l'utilisateur est une référence à quelque valeur que ce soit est actuellement assigné à il au moment l'expression est évaluée.
Dans votre requête, les prédicats dans la clause where sont évalués avant les expressions dans la liste de sélection.
Qui est,
@var < 10
est évaluée comme une expression booléenne alors que les lignes sont accessibles, pour chaque candidat, la ligne, l'expression est évaluée, et la ligne est renvoyée uniquement si le résultat est VRAI.Si vous étiez à fournir une valeur pour cette variable qui a une valeur numérique supérieure ou égale à dix, avant que l'instruction a été exécutée, TOUTES les lignes seront retournés.
Q: Comment puis-je filtrer les résultats en fonction de la valeur de
@var
?Vous ne pouvez pas vraiment. (En fait, c'est ce que votre requête initiale est en train de faire.)
Vous pouvez inclure des prédicats sur les expressions autres que
@var
; et ces expressions peuvent être dérivées à partir de la valeur attribuée à@var
.Comme une option, vous pouvez retourner une expression dans la liste de sélection, et ensuite utiliser un
HAVING
clause de filtrer les lignes retournées. (NOTE: leHAVING
clause est évalué après le resultset est préparé; à la différence de laWHERE
clause, qui est évaluée à la fois les lignes sont accessibles.)Une autre alternative est d'utiliser une ligne de vue de préparer le jeu de résultats, puis une requête externe peut utiliser une clause where sur une expression qui est retourné.
Mais à proprement parler, ceux de ces approches sont à la fois l'application des prédicats sur les expressions autres que
@var
, ils ne sont pas d'effectuer un test de la valeur dans@var
.OriginalL'auteur spencer7593