web-dev-qa-db-de.com

Case Statement in MySQL

Es gibt eine Tabelle ' tbl_transaction ' mit 

id INT(11) Primary Key
action_type ENUM('Expense', 'Income')
action_heading VARCHAR (255)
action_amount FLOAT

Ist es möglich, ein Ergebnis zu erhalten, das nur die SQL-Abfrage verwendet, in der alle Ausgabenbeträge in der Spalte "Spesenamt" und der Einkommensbetrag in der Spalte "Income Amt" aufgeführt sind:

ID        Heading         Income Amt       Expense Amt
1         ABC             1000             -
2         XYZ             -                2000

Ich verwende MySQL als Datenbank. Und ich versuche die CASE-Anweisung zu verwenden.

Prost!

50
Pradip Kharbuja

Ja so etwas:

SELECT
    id,
    action_heading,
    CASE
        WHEN action_type = 'Income' THEN action_amount
        ELSE NULL
    END AS income_amt,
    CASE
        WHEN action_type = 'Expense' THEN action_amount
        ELSE NULL
    END AS expense_amt

FROM tbl_transaction;

Wie andere Antworten gezeigt haben, hat MySQL auch die Funktion IF(), um dies mit weniger ausführlicher Syntax zu tun. Ich versuche dies generell zu vermeiden, da es sich um eine MySQL-spezifische Erweiterung von SQL handelt, die anderswo normalerweise nicht unterstützt wird. CASE ist Standard-SQL und viel portabler für verschiedene Datenbank-Engines. Ich ziehe vor, tragbare Abfragen so weit wie möglich zu schreiben, wobei ich nur Engine-spezifische Erweiterungen verwende, wenn die portable Alternative erheblich langsamer oder weniger bequem ist.

129
cdhowie

MySQL hat auch IF():

SELECT 
  id, action_heading, 
      IF(action_type='Income',action_amount,0) income, 
      IF(action_type='Expense', action_amount, 0) expense
FROM tbl_transaction
21

Versuchen Sie, IF(condition, value1, value2) zu verwenden

SELECT ID, HEADING, 
IF(action_type='Income',action_amount,0) as Income,
IF(action_type='Expense',action_amount,0) as Expense
8
Riho

Das sollte funktionieren: 

select 
  id
  ,action_heading
  ,case when action_type='Income' then action_amount else 0 end
  ,case when action_type='Expense' then expense_amount else 0 end
from tbl_transaction
2

Beachten Sie auch, dass es zwei verschiedene CASEs mit MySQL gibt: eine wie @cdhowie und andere hier beschrieben (und hier dokumentiert: http://dev.mysql.com/doc/refman/5.7/de/control -flow-functions.html # operator_case ) und etwas, das als CASE bezeichnet wird, aber eine völlig andere Syntax und eine völlig andere Funktion hat, hier dokumentiert: https://dev.mysql.com/doc/refman// de/case.html

Ich benutze immer eins zuerst, wenn ich das andere will.

2
nomadkbro

Ich hoffe, dass Sie damit die richtige Lösung finden werden: 

Syntax: 

   CASE  
        WHEN search_condition THEN statement_list  
       [WHEN search_condition THEN statement_list]....
       [ELSE statement_list]  
   END CASE

Implementierung:

select id, action_heading,  
   case when
             action_type="Expense" then action_amount  
             else NULL   
             end as Expense_amt,   
    case when  
             action_type ="Income" then action_amount  
             else NULL  
             end as Income_amt  
  from tbl_transaction;

Hier verwende ich die CASE-Anweisung, da sie flexibler ist als if-then-else. Es erlaubt mehr als eine Branche. Die CASE-Anweisung ist Standard-SQL und funktioniert in den meisten Datenbanken.

0
Sushmita Konar