MySQL中的case语句

Posted

技术标签:

【中文标题】MySQL中的case语句【英文标题】:Case statement in MySQL 【发布时间】:2013-02-22 08:06:05 【问题描述】:

我有一个名为“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:“我正在尝试使用 CASE 语句。”哪里是 ?也发一下。 SELECT *, CASE WHEN action_type = 'Expense' THEN 'expense_amount' ELSE 'income_amount' END FROM tbl_extra_income_expense 我只是得到了费用金额或收入金额字符串而不是价值。 去掉引号,你会得到值而不是字符串。 【参考方案1】:

是的,是这样的:

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,并且在不同的数据库引擎之间可移植性更高,我更喜欢尽可能编写可移植查询,仅当可移植替代方案相当更慢或更慢时才使用特定于引擎的扩展方便。

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案5】:

要记住的另一件事是 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/en/case.html

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

【讨论】:

【参考方案6】:

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

语法:

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

【讨论】:

以上是关于MySQL中的case语句的主要内容,如果未能解决你的问题,请参考以下文章

Mysql:分支结构—case结构

MySQL中的if和case语句使用总结

MySQL 存储过程CASE语句用法

mysql - ORDER BY 语句中的 IF...ELSE 或 CASE

MySQL 在 CASE 语句中使用 date()

MySQL 的CASE WHEN 语句