'IF' nell'istruzione 'SELECT': scegliere il valore di output in base ai valori di colonna


685
SELECT id, amount FROM report

Devo amountessere amountse report.type='P'e -amountse report.type='N'. Come aggiungo questo alla query sopra?

Risposte:


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

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

Inoltre, è possibile gestire quando la condizione è nulla. Nel caso di un importo nullo:

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

La parte IFNULL(amount,0)indica quando l'importo non è un valore nullo, altrimenti restituisce 0 .


5
Mi chiedo se ci sia qualche vantaggio nell'usare questo IFNULL invece di COALESCE qui?
Chris,

4
Dalla fonte mysql, noto 2 definizioni di coalesce, una con 2 argomenti e l'altra con un elenco di argomenti, ma ifnull invoca la coalesce con 2 parametrisql/item_cmpfunc.h 722: Item_func_ifnull(Item *a, Item *b) :Item_func_coalesce(a,b) {}
Felipe Buccioni

2
La risposta non è corretta se esistono tipi di report diversi da 'N' e 'P', vedere il commento di BadHorsie nella migliore soluzione "case case".
Prova il

3
@ Trygve La domanda è per 2 condizioni e, alla ricerca di una IFdichiarazione, cosa c'è che non va?
Felipe Buccioni,

2
@Felipe, la risposta non è necessariamente corretta al 100%, potrebbero esserci altri tipi di rapporti diversi da N e P. Nel tuo caso, ciò potrebbe portare a un errore, selezionando -ammontare se il tipo di rapporto (come esempio) è 'E'. La domanda non menziona se ci sono altri tipi di report, quindi rimuovo il mio voto negativo. Mi piace solo programmare in modo difensivo in questi casi, quindi fai attenzione agli altri lettori.
Prova il

255

Usa una casedichiarazione:

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

5
@Evan: True. Li uso per chiarezza. Non che influisca comunque su qualcosa.
mellamokb,

3
Preferisco la sintassi standard ANSI rispetto alla sintassi personalizzata per un determinato database.
Gordon Linoff,

2
Questa è la soluzione migliore perché la soluzione di risposta accettata non è necessariamente appropriata se esistono altri valori per report.type o se un nuovo report.type viene introdotto in un secondo momento. Sta dicendo if report.type = 'P' use amount, otherwise use -amount for anything else. non considererà il tipo se non è "P".
BadHorsie,

97
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;

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

15

Il modo più semplice è usare un IF () . Sì, Mysql ti consente di eseguire la logica condizionale. La funzione IF accetta 3 parametri CONDITION, TRUE OUTCOME, FALSE OUTCOME.

Quindi la logica è

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

Puoi saltare abs () se tutti i no sono + solo ve


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

UNION

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

ORDER BY id;

Poiché i set di risultati si escludono a vicenda, preferisco UNION ALL qui.
Arth,

4

Puoi provare anche questo

 SELECT id , IF(type='p', IFNULL(amount,0), IFNULL(amount,0) * -1) as amount FROM table
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.