web-dev-qa-db-fra.com

Déclaration de cas dans MySQL

Il y a une table ' tbl_transaction ' avec 

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

Est-il possible d'obtenir un résultat en utilisant uniquement SQL Query répertoriant tous les montants de dépenses dans la colonne Dépenses et le montant de revenus dans la colonne Revenus, comme:

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

J'utilise MySQL comme base de données. Et j'essaie d'utiliser l'instruction CASE.

À votre santé!

50
Pradip Kharbuja

Oui, quelque chose comme ça:

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;

Comme d'autres réponses l'ont souligné, MySQL dispose également de la fonction IF() qui utilise une syntaxe moins détaillée. J'essaie généralement d'éviter cela, car il s'agit d'une extension SQL spécifique à MySQL qui n'est généralement pas prise en charge ailleurs. CASE est le SQL standard et est beaucoup plus portable entre différents moteurs de base de données, et je préfère écrire autant que possible les requêtes portables, en n'utilisant que des extensions spécifiques au moteur lorsque l'alternative portable est considérablement plus lent ou moins pratique.

129
cdhowie

MySQL a aussi 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
Bart Friederichs

Essayez d'utiliser IF(condition, value1, value2)

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

Cela devrait fonctionner: 

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

Une autre chose à garder à l'esprit est qu'il existe deux CASE différents avec MySQL: un exemple, décrit par @cdhowie et d'autres (et documenté ici: http://dev.mysql.com/doc/refman/5.7/en/control -flow-functions.html # opérateur_case ) et quelque chose appelé CASE, mais dont la syntaxe et la fonction sont complètement différentes, documentée ici: https://dev.mysql.com/doc/refman/5.0/ en/case.html

Invariablement, j'utilise d'abord l'un quand je veux l'autre.

2
nomadkbro

J'espère que cela vous apportera la bonne solution: 

Syntaxe: 

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

La mise en oeuvre:

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;

Ici, j'utilise l'instruction CASE car elle est plus flexible que if-then-else. Il permet plus d'une branche. Et l'instruction CASE correspond à SQL standard et fonctionne dans la plupart des bases de données.

0
Sushmita Konar