sql-MySQL中的Case语句

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

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

我想生成两列:Income AmtExpense Amt

是否可以仅使用SQL查询有条件地填充列,以使输出出现在正确的列中,具体取决于它是费用项目还是收入项目?

例如:

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

我正在使用MySQL作为数据库。 我正在尝试使用CASE语句来完成此操作。

干杯!

Pradip Kharbuja asked 2019-11-16T22:46:32Z
6个解决方案
135 votes

是的,像这样:

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的特定于MySQL的扩展,其他地方通常不支持。 CASE是标准的SQL,在不同的数据库引擎中具有更大的可移植性,我更喜欢尽可能地编写可移植的查询,仅在可移植替代方案较慢或不太方便时才使用特定于引擎的扩展。

cdhowie answered 2019-11-16T22:47:07Z
21 votes

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
Bart Friederichs answered 2019-11-16T22:47:32Z
8 votes

尝试使用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
Riho answered 2019-11-16T22:47:56Z
3 votes

这应该工作:

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
Dumitrescu Bogdan answered 2019-11-16T22:48:21Z
2 votes

要记住的另一件事是MySQL有两种不同的CASE:一种类似于@cdhowie,另一种如此处所述(并在此处记录:[http://dev.mysql.com/doc/refman/5.7/en/control- flow-functions.html#operator_case)]和称为CASE的东西,但是具有完全不同的语法和完全不同的功能,在此处记录:[https://dev.mysql.com/doc/refman/5.0/zh/case .html]

总是,当我想要另一个时,我总是先使用一个。

nomadkbro answered 2019-11-16T22:48:52Z
0 votes

我希望这会为您提供正确的解决方案:

句法:

   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,适用于大多数数据库。

Sushmita Konar answered 2019-11-16T22:49:31Z
translate from https://stackoverflow.com:/questions/15265874/case-statement-in-mysql