Maison >base de données >tutoriel mysql >Comment puis-je définir et utiliser en toute sécurité une variable dans une instruction SQL SELECT ?

Comment puis-je définir et utiliser en toute sécurité une variable dans une instruction SQL SELECT ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-02 03:56:12392parcourir

How Can I Safely Define and Use a Variable Within a SQL SELECT Statement?

Définir et utiliser une variable dans une instruction Select

En SQL, il n'est généralement pas recommandé d'attribuer une valeur à une variable utilisateur et utilisez-le dans la même instruction select. La documentation de MySQL indique explicitement que l'ordre d'évaluation de ces expressions n'est pas défini et peut varier en fonction des éléments de la déclaration et des versions du serveur.

Pour illustrer ce point, considérons la requête suivante :

SELECT 
    @z:=SUM(item),
    2*@z
FROM
    TableA;

Dans cette requête, vous vous attendez à ce que la deuxième colonne renvoie la valeur de @z multipliée par deux. Cependant, MySQL peut renvoyer NULL, car l'ordre d'évaluation n'est pas garanti. Ce comportement diffère de l'utilisation d'une procédure stockée au lieu d'une variable utilisateur, comme indiqué ci-dessous :

SELECT 
    @z:=someProcedure(item),
    2*@z
FROM
    TableA;

Dans ce cas, les résultats attendus sont obtenus car l'appel de procédure stockée est évalué avant l'affectation de la variable.

Pour résoudre ce problème et définir une variable dans une instruction select, vous pouvez utiliser une sous-requête :

select @z, @z*2
from (SELECT @z:=sum(item)
      FROM TableA
     ) t;

Cette approche garantit que l'affectation de la variable se produit avant qu'elle ne soit utilisée dans la requête externe.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn