MySQL中的Case语句

67

我有一个名为 'tbl_transaction' 的数据库表,其定义如下:

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

我希望生成两列:Income Amt和Expense Amt。
是否可以仅使用SQL查询有条件地填充这些列,以便根据是支出项还是收入项在正确的列中显示输出?
例如:
ID        Heading         Income Amt       Expense Amt
1         ABC             1000             -
2         XYZ             -                2000

我正在使用MySQL作为数据库。我试图使用CASE语句来实现这个目标。
干杯!

@Pradip: "我正在尝试使用CASE语句。"它在哪里?也一并发布。 - Hardik Mishra
SELECT *,CASE WHEN action_type = 'Expense' THEN 'expense_amount' ELSE 'income_amount' END FROM tbl_extra_income_expense - Pradip Kharbuja
我只是获取了expense_amount或income_amount字符串,而不是值。 - Pradip Kharbuja
去掉引号,你将得到值而不是字符串。 - Barmar
6个回答

150

是的,类似这样:

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;

作为其他答案指出的,MySQL也有IF()函数来使用更少的冗长语法来实现这一点。我通常会避免使用它,因为它是MySQL特定的SQL扩展,在其他地方通常不受支持。CASE是标准SQL,对于不同的数据库引擎更具可移植性,我倾向于尽可能编写可移植的查询,只在可移植的替代方案明显较慢或不太方便时使用特定于引擎的扩展。

23

MySQL 也有 IF() 函数:

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

10
尝试使用 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

4
这应该可以工作:
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

2
我可以为您提供正确的解决方案:
语法:
   CASE  
        WHEN search_condition THEN statement_list  
       [WHEN search_condition THEN statement_list]....
       [ELSE statement_list]  
   END CASE

实现:

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;

我使用 CASE 语句,因为它比 if-then-else 更灵活。它允许有多个分支。而且,CASE 语句是标准的 SQL,在大多数数据库中都适用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接