web-dev-qa-db-fra.com

MySQL IF ELSEIF dans une requête select

J'essaie de sélectionner différents prix d'un produit en fonction de la quantité choisie par l'utilisateur. Voici la requête sur laquelle je travaille (il y a une erreur de syntaxe):

 select id, 
    (SELECT 
    IF(qty_1<='23',price,1)
    ELSEIF(('23'>qty_1 && qty_2<='23'),price_2,1)
    ELSEIF(('23'>qty_2 && qty_3<='23'),price_3,1)
    ELSEIF('23'>qty_3,price_4,1)
    END IF) as total 
 from product;
62
Ivan Bravo Carlos

Vous avez ce que vous avez utilisé dans les procédures stockées comme ceci pour référence, mais elles ne sont pas destinées à être utilisées comme vous l'avez maintenant. Vous pouvez utiliser IF comme indiqué par duskwuff. Mais une déclaration Case est préférable pour les yeux. Comme ça:

select id, 
    (
    CASE 
        WHEN qty_1 <= '23' THEN price
        WHEN '23' > qty_1 && qty_2 <= '23' THEN price_2
        WHEN '23' > qty_2 && qty_3 <= '23' THEN price_3
        WHEN '23' > qty_3 THEN price_4
        ELSE 1
    END) AS total
 from product;

Cela semble plus propre. Je suppose que vous n’avez pas besoin de l’intérieur SELECT de toute façon ..

158
nawfal

IF() dans MySQL est une fonction ternaire, pas une structure de contrôle. Si la condition du premier argument est vraie, elle renvoie le deuxième argument. sinon, il retourne le troisième argument. Il n'y a pas de fonction ELSEIF() ni de mot clé END IF correspondants.

L'équivalent le plus proche de ce que vous avez serait quelque chose comme:

IF(qty_1<='23', price,
  IF('23'>qty_1 && qty_2<='23', price_2,
    IF('23'>qty_2 && qty_3<='23', price_3,
      IF('23'>qty_3, price_4, 1)
    )
  )
)

Les conditions n’ont pas toutes un sens pour moi (il semble que certaines d’entre elles pourraient être inversées par inadvertance?), Mais sans savoir ce que vous essayez exactement d’accomplir, il m’est difficile de résoudre ce problème.

16
duskwuff

J'ai trouvé un bogue dans MySQL 5.1.72 lors de l'utilisation des fonctions if () imbriquées ... La valeur des variables de colonne (par exemple, qty_1) est vide à l'intérieur du second if (), ce qui la rend inutile. Utilisez plutôt la construction suivante:

case 
  when qty_1<='23' then price
  when '23'>qty_1 && qty_2<='23' then price_2
  when '23'>qty_2 && qty_3<='23' then price_3
  when '23'>qty_3 then price_4
  else 1
end
6
Dave Crooke

Pour ta question:

SELECT id, 
   IF(qty_1 <= '23', price,
   IF(('23' > qty_1 && qty_2 <= '23'), price_2,
   IF(('23' > qty_2 && qty_3 <= '23'), price_3,
   IF(('23' > qty_2 && qty_3<='23'), price_3,
   IF('23' > qty_3, price_4, 1))))) as total 
FROM product;

Vous pouvez utiliser la structure de contrôle if - else ou la fonction IF dans MySQL.

Référence:
http://easysolutionweb.com/sql-pl-sql/how-to-use-if-and-else-in-mysql/

3
Dilraj Singh

Selon la réponse de Nawfal, les déclarations IF doivent figurer dans une procédure. J'ai trouvé cet article qui montre un exemple brillant d'utilisation de votre script dans une procédure tout en développant et en testant. Fondamentalement, vous créez, appelez puis supprimez la procédure:

https://Gist.github.com/jeremyjarrell/6083251

2
Warren