'IF' en la declaración 'SELECT': elija el valor de salida en función de los valores de columna

SELECT id, amount FROM report

Necesito amount para ser amount if report.type='P' y -amount if report.type='N'. ¿Cómo agrego esto a la consulta anterior?

preguntado el 10 de mayo de 11 a las 13:05

7 Respuestas

SELECT id, 
       IF(type = 'P', amount, amount * -1) as amount
FROM report

Vea http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html.

Además, podría manejar cuando la condición es nula. En el caso de una cantidad nula:

SELECT id, 
       IF(type = 'P', IFNULL(amount,0), IFNULL(amount,0) * -1) as amount
FROM report

La parte IFNULL(amount,0) significa cuando el monto no es nulo, devuelve el monto en caso contrario, devuelve 0.

Respondido el 25 de enero de 17 a las 04:01

Me pregunto si hay alguna ventaja en usar este IFNULL en lugar de COALESCE aquí. - Chris

Desde la fuente de mysql, noto 2 definiciones de fusión, una con 2 argumentos y otra con una lista de argumentos, pero ifnull invoca la fusión con 2 parámetros sql/item_cmpfunc.h 722: Item_func_ifnull(Item *a, Item *b) :Item_func_coalesce(a,b) {} - Felipe Buccioni

La respuesta no es correcta si hay diferentes tipos de informes que 'N' y 'P', consulte el comentario de BadHorsie en la mejor solución de "declaración de caso". - Trygve

@ Trygve La pregunta es para 2 condiciones, y buscando una IF declaración, ¿qué pasa? - Felipe Buccioni

@Felipe, la respuesta no es necesariamente 100% correcta, podría haber otros tipos de informes además de N y P. En su caso, esto podría llevar a un error, seleccionando -amount si el tipo de informe (como ejemplo) es 'E'. Sin embargo, la pregunta no menciona si hay otros tipos de informes, así que elimino mi voto negativo. Solo me gusta programar a la defensiva en estos casos, así que un aviso a otros lectores. - Trygve

Utilizar case declaración:

select id,
    case report.type
        when 'P' then amount
        when 'N' then -amount
    end as amount
from
    `report`

contestado el 10 de mayo de 11 a las 17:05

@Evan: Cierto. Los uso para mayor claridad. No es que afecte a nada de todos modos. - mellamokb

Prefiero la sintaxis estándar ANSI sobre la sintaxis personalizada para una base de datos en particular. - Gordon Linoff

Esta es la mejor solución porque la solución de respuesta aceptada no es necesariamente apropiada si hay otros valores para report.type, o si se introduce un nuevo report.type en una fecha posterior. Esta diciendo if report.type = 'P' use amount, otherwise use -amount for anything else. no considerará el tipo si no es 'P'. - BadHorsie

SELECT CompanyName, 
    CASE WHEN Country IN ('USA', 'Canada') THEN 'North America'
         WHEN Country = 'Brazil' THEN 'South America'
         ELSE 'Europe' END AS Continent
FROM Suppliers
ORDER BY CompanyName;

respondido 08 nov., 12:10

select 
  id,
  case 
    when report_type = 'P' 
    then amount 
    when report_type = 'N' 
    then -amount 
    else null 
  end
from table

Respondido 04 ago 16, 12:08

La forma más sencilla es utilizar un SI(). Sí, Mysql te permite hacer lógica condicional. SI la función toma 3 parámetros CONDICIÓN, RESULTADO VERDADERO, RESULTADO FALSO.

Entonces la lógica es

if report.type = 'p' 
    amount = amount 
else 
    amount = -1*amount 

SQL

SELECT 
    id, IF(report.type = 'P', abs(amount), -1*abs(amount)) as amount
FROM  report

Puede omitir abs () si todos los no son solo + ve

Respondido el 25 de enero de 15 a las 05:01

SELECT id, amount
FROM report
WHERE type='P'

UNION

SELECT id, (amount * -1) AS amount
FROM report
WHERE type = 'N'

ORDER BY id;

contestado el 11 de mayo de 13 a las 18:05

Como los conjuntos de resultados son mutuamente excluyentes, prefiero UNION ALL aquí. - Arth

Puedes probar esto también

 SELECT id , IF(type='p', IFNULL(amount,0), IFNULL(amount,0) * -1) as amount FROM table

Respondido 02 Oct 19, 19:10

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.