MySQL IF ELSEIF en una consulta de selección

81

Estoy tratando de seleccionar diferentes precios de un producto en función de la cantidad que elija el usuario. Esta es la consulta en la que estoy trabajando (tiene un error de sintaxis):

 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;
Iván Bravo Carlos
fuente
7
debe usar CASE
Sir Rufo

Respuestas:

202

Tiene lo que ha usado en procedimientos almacenados como este como referencia, pero no están diseñados para usarse como lo tiene ahora. Puede utilizar IFcomo se muestra en duskwuff. Pero una Casedeclaración es mejor para los ojos. Me gusta esto:

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;

Esto parece más limpio. Supongo que no necesitas el interior de SELECTtodos modos ...

nawfal
fuente
2
Sí, de hecho, se ve mejor, elegiré esta opción pero es bueno tener ambos enfoques para futuras referencias. Gracias nawfal
Ivan Bravo Carlos
Es bueno que se utilice CASE para IF. Gracias Nawfal
Satya Kalluri
20

IF()en MySQL es una función ternaria, no una estructura de control - si la condición en el primer argumento es verdadera, devuelve el segundo argumento; de lo contrario, devuelve el tercer argumento. No hay una ELSEIF()función o END IFpalabra clave correspondiente .

El equivalente más cercano a lo que tienes sería algo como:

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)
    )
  )
)

No todas las condiciones tienen sentido para mí (¿parece que algunas de ellas pueden revertirse inadvertidamente?), Pero sin saber exactamente qué está tratando de lograr, es difícil para mí arreglar eso.

anochecer-inactivo-
fuente
Supongo que hace un minuto ... seleccione productoid, precio, precio_2, precio_3, IF (cant_1> 23, precio, IF (23> cant_1 && cant_2> 23, precio_2, IF (23> cant_2 && cant_3> 23, precio_3) , IF (23> cant_4, precio_4,1)))) como total del producto, el problema es que no puedo crear una tabla de precios independiente debido a la solicitud de mi jefe de que sería mucho más fácil hacer una unión y obtener el precio basado en la cantidad ...
Ivan Bravo Carlos
una cosa más cercana estaría usandocase when (condition) then {computed value} when then else end
ahnbizcad
9

Encontré un error en MySQL 5.1.72 al usar las funciones anidadas if () .... el valor de las variables de columna (por ejemplo, qty_1) está en blanco dentro del segundo if (), lo que lo vuelve inútil. En su lugar, utilice la siguiente construcción:

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
Dave Crooke
fuente
4

Para tu pregunta:

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;

Puede utilizar la if - elseestructura de control o la IFfunción en MySQL.

Referencia:
http://easysolutionweb.com/sql-pl-sql/how-to-use-if-and-else-in-mysql/

Dilraj Singh
fuente
1
Aunque su respuesta es 100% correcta, también podría volverse 100% inútil si ese enlace se mueve, cambia, fusiona con otro o si el sitio principal simplemente desaparece ... :-( Por lo tanto, edite su respuesta y copie el pasos desde el enlace hasta su respuesta, ¡garantizando así su respuesta durante el 100% de la vida útil de este sitio! ;-) Siempre puede dejar el enlace en la parte inferior de su respuesta como fuente para su material ...
Donald Duck
2

Según la respuesta de Nawfal, las declaraciones IF deben estar en un procedimiento. Encontré esta publicación que muestra un ejemplo brillante de cómo usar su script en un procedimiento mientras aún se desarrolla y prueba. Básicamente, usted crea, llama y luego suelta el procedimiento:

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

Madriguera
fuente