'IF' in der Anweisung 'SELECT' - Wählen Sie den Ausgabewert basierend auf den Spaltenwerten aus

685
SELECT id, amount FROM report

Ich muss amountsein, amountwenn report.type='P'und -amountwenn report.type='N'. Wie füge ich dies der obigen Abfrage hinzu?

Michael
quelle

Antworten:

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

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

Darüber hinaus können Sie behandeln, wenn die Bedingung null ist. Im Falle eines Nullbetrags:

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

Der Teil IFNULL(amount,0)bedeutet, wenn der Betrag nicht Null ist, Rückgabebetrag, sonst Rückgabe 0 .

Felipe Buccioni
quelle
5
Ich frage mich, ob es einen Vorteil hat, diesen IFNULL anstelle von COALESCE hier zu verwenden.
Chris
4
Aus der MySQL-Quelle stelle ich 2 Definitionen von Koaleszenz fest, eine mit 2 Argumenten und eine mit einer Liste von Argumenten, aber ifnull ruft die Koaleszenz mit 2 Parametern aufsql/item_cmpfunc.h 722: Item_func_ifnull(Item *a, Item *b) :Item_func_coalesce(a,b) {}
Felipe Buccioni
2
Die Antwort ist nicht korrekt, wenn es andere Berichtstypen als 'N' und 'P' gibt, siehe BadHorsies Kommentar in der besseren "case Statement" -Lösung.
Trygve
3
@Trygve Die Frage ist für 2 Bedingungen und auf der Suche nach einer IFAussage, was ist los?
Felipe Buccioni
2
@Felipe, die Antwort ist nicht unbedingt 100% korrekt. Es kann andere Berichtstypen als N und P geben. In Ihrem Fall kann dies zu einem Fehler führen, indem Sie -amount auswählen, wenn der Berichtstyp (als Beispiel) 'E' ist. In der Frage wird jedoch nicht erwähnt, ob es andere Berichtstypen gibt, daher entferne ich meine Ablehnung. Ich programmiere in diesen Fällen nur gerne defensiv, also ein Heads-up zu anderen Lesern.
Trygve
255

Verwenden Sie eine caseAnweisung:

select id,
    case report.type
        when 'P' then amount
        when 'N' then -amount
    end as amount
from
    `report`
mellamokb
quelle
5
@Evan: Stimmt. Ich benutze sie zur Klarheit. Nicht, dass es irgendetwas betrifft.
Mellamokb
3
Ich bevorzuge die ANSI-Standardsyntax gegenüber der benutzerdefinierten Syntax für eine bestimmte Datenbank.
Gordon Linoff
2
Dies ist die beste Lösung, da die akzeptierte Antwortlösung nicht unbedingt geeignet ist, wenn andere Werte für report.type vorhanden sind oder wenn zu einem späteren Zeitpunkt ein neuer report.type eingeführt wird. Es heißt if report.type = 'P' use amount, otherwise use -amount for anything else. Der Typ wird nicht berücksichtigt, wenn er nicht 'P' ist.
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;
user1210826
quelle
43
select 
  id,
  case 
    when report_type = 'P' 
    then amount 
    when report_type = 'N' 
    then -amount 
    else null 
  end
from table
sang kaul
quelle
15

Am einfachsten ist es, ein IF () zu verwenden . Ja, mit MySQL können Sie bedingte Logik ausführen. Die IF-Funktion benötigt 3 Parameter. ZUSTAND, WAHRES ERGEBNIS, FALSCHES ERGEBNIS.

Logik ist also

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

Sie können abs () überspringen, wenn alle Nein nur + ve sind

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

UNION

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

ORDER BY id;
Linitux
quelle
Da sich die Ergebnismengen gegenseitig ausschließen, bevorzuge ich hier UNION ALL.
Arth
4

Sie können dies auch versuchen

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