8
votes

Puis-je réutiliser une expression dans une requête MySQL en tant que variable pour un autre champ?

Y a-t-il une solution de contournement afin que je puisse réellement faire quelque chose comme ça sans avoir à répéter l'ensemble de l'expression ou forcer une table ou une table temporaire?

SELECT  (complex expression) AS variable1,
        (complex expression based on variable1) AS variable2


3 Réponses :


4
votes
SELECT @v1:=(complex expression) AS variable1,
       (complex expression * @v1) AS variable2

6 commentaires

Je vais être horrifié si c'est simplement aussi facile et honnêtement, je ne pouvais pas le comprendre, mais merci!


Ah, tu sais quoi? La page manuelle énumérée ci-dessus par Knittl a des avertissements répétés de ne pas utiliser ou s'appuyer sur des variables définies dans la même instruction SELECT, car les champs peuvent être exécutés hors de la commande sur la base de l'endroit où, etc. et la variable est détenue à partir de l'exécution précédente. Donc, la nouvelle utilisation des variables dans le même choix est probablement une mauvaise idée, elle est destinée à des requêtes séquentielles.


Personnellement, je n'ai jamais vu le comportement averti dans le manuel, même après avoir essayé de le faire arriver. Mais si le manuel met en garde contre celui-ci, je ne l'utiliserais pas. BLEH


Je peux confirmer que cette solution ne fonctionne pas, comme dans mon cas, il réutilisait la valeur définie dans la requête précédente. Townvoted.


Si tel est le cas, vous n'avez pas utilisé cette requête exacte. Si vous avez un problème avec votre requête, vous devez poser une nouvelle question au lieu de voter une réponse que vous avez mal utilisée.


Sauf que comme @ck_ mentionné, la documentation dit explicitement de ne pas le faire: "En règle générale, autre que dans les instructions définies, vous ne devez jamais attribuer de valeur à une variable utilisateur et lire la valeur dans la même déclaration.". C'est donc faux et mérite toujours un bowvote, désolé.



0
votes

Je pense que le seul moyen est de répéter votre premier complexe_expression dans votre seconde, bien que je pensais que MySQL puisse gérer de tels cas.

EDIT: Une recherche rapide a été relevée: http: //dev.mysql.com/doc/refman/5.0/fr/user-variables.html


2 commentaires

Merci pour le lien, j'ai complètement manqué cette partie de MySQL!


Votre lien vers le manuel était très utile pour comprendre pourquoi la solution de Longneck était défectueuse, merci encore de nouveau.



7
votes

Poussez le premier calcul dans une table dérivée:

select variable1
     , complex_function(variable1, other_column) as variable2
     , yet_another column
  from (select complex_operation as variable1
             , other_column
             , yet_another_column
          from whatever) dt


1 commentaires

C'est Messier que je ne le voulais mais je vais vous donner la meilleure réponse à tous vos efforts, merci.