Maison > base de données > tutoriel mysql > Pourquoi l'utilisation de variables dans une seule instruction SQL SELECT renvoie-t-elle souvent des résultats inattendus ?

Pourquoi l'utilisation de variables dans une seule instruction SQL SELECT renvoie-t-elle souvent des résultats inattendus ?

DDD
Libérer: 2024-12-20 22:29:13
original
301 Les gens l'ont consulté

Why Does Using Variables in a Single SQL SELECT Statement Often Return Unexpected Results?

Déclarer et utiliser des variables dans une instruction SELECT

En SQL, attribuer une valeur à une variable et récupérer cette valeur dans la même requête peut être un défi. Prenons l'exemple suivant :

SELECT 
    @z:=SUM(item),
    2*@z
FROM
    TableA;
Copier après la connexion

Cette requête tente de calculer la somme de la colonne "item" et de la stocker dans une variable nommée "@z". Il multiplie ensuite la valeur de "@z" par 2. Cependant, étonnamment, la deuxième colonne renvoie toujours NULL.

Cela se produit parce que la documentation de MySQL indique explicitement que l'attribution d'une valeur à une variable utilisateur et sa lecture dans le il ne faut pas se fier à la même déclaration. L'ordre d'évaluation de ces expressions n'est pas défini et est susceptible de changer dans les versions futures.

Pour illustrer cela davantage, considérons la requête alternative :

SELECT 
    @z:=someProcedure(item),
    2*@z
FROM
    TableA;
Copier après la connexion

Dans cette requête, "@z" est attribué une valeur via un appel de procédure. Dans ce scénario, la requête fonctionne comme prévu car l'appel de procédure est évalué séparément de l'affectation de variable.

Pour surmonter la limitation des variables utilisateur, vous pouvez utiliser une sous-requête pour attribuer la valeur et la récupérer dans le fichier principal. requête :

select @z, @z*2
from (SELECT @z:=sum(item)
      FROM TableA
     ) t;
Copier après la connexion

Dans cette sous-requête, la valeur de "@z" est attribuée à l'aide de SELECT. La requête principale sélectionne ensuite "@z" et effectue les calculs nécessaires.

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal