2010-11-14 14 views
7

Nicht sicher, wie weit eine SQL-Abfrage mit if/else-Anweisungen gehen kann.mysql IF Else-Anweisung

Ich habe eine einfache SELECT-Anweisung:

amount SELECT, transtype VON transactions

Die transtype Spalte eine Zahl sein wird.

Zum Beispiel 1 = Verkauf, 2 = Rückerstattung, 3 = Fehler, 4 = storniert, 5 = etwas anderes .... und so weiter.

Also, nichts Kompliziertes. Die Liste wächst jedoch aus Berichterstattungsgründen. Was ist in Ordnung.

Für eine bestimmte Abfrage, an der ich arbeite, gibt es eine Möglichkeit, diese Spalte als eine von zwei oder drei angegebenen Zahlen oder Text zu extrahieren?

Zum Beispiel sind einige Transtypen Zahlen ein "Verlust", während andere ein "Gewinn" sind, und vielleicht sind andere "neutral".

Ich möchte diese Spalte mit nur diesen 3 extrahieren, ohne PHP in der HTML-Tabelle zu verwenden, in die ich die Zeilen werfe.

Wenn meine Erklärung nicht klar ist, entschuldige ich mich. Es war schwer auszuspucken.

+0

Sie möchten Ihre Transtyp-Werte als Verlust, Gewinn oder Neutral kategorisieren? –

Antwort

3

Verwenden MySQL CASE() Funktion für eine feste Anzahl von Argumenten. Wenn die Liste groß wird, sollten Sie eine zweite Tabelle verwenden und sich ihnen anschließen.

Beispiel:

SELECT CASE WHEN 1>0 THEN 'true' ELSE 'false' END; 
2

Versuchen Sie, eine Verbindung mit einer anderen Tabelle herzustellen, die die Transaktionstypen enthält. Etwas wie:

TRANSACTION_TYPES 
transtype | number 
label  | varchar(32) 

ändern Sie dann Ihre Abfrage die Join enthalten:

select t.amount, t.transtype, l.label 
    from transactions.t 
    join transaction_types l on t.transtype = l.transtype; 
+0

Ich versuchte, mich von dem zusätzlichen Tisch fernzuhalten. Ich sehe nicht voraus, dass der Transtyp mehr als 10 Nummern hat. Aber du hast Recht, das ist eine schnelle Lösung. – coffeemonitor

+0

Es wird auch die relationale Integrität der Datenbank erhalten, so dass Sie es ohne die spezifische Abfrage sinnvoll machen können, Ihre magischen Zahlen für Sie zu "erklären". –

0

Die ELT Funktion sollte es tun:

SELECT ELT(`transtype`, 'loss', 'loss', 'gain', 'neutral', …) FROM … 

Nicht sehr elegant aber, und logisch würde ich tun dies in der Ansicht Logik, nicht die Datenbanklogik.

0

Sie sollten wahrscheinlich ENUM type für diese Spalte verwenden. Es ist auf 64 Werte beschränkt. Wenn Sie jedoch mehr benötigen, sollten Sie eine neue Tabelle und JOIN in der Abfrage erstellen.