MySQL中的个案陈述

有一个表' tbl_transaction '

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

是否有可能得到结果只使用SQL查询列出费用金额列中的所有费用金额和收入金额列中的收入金额列如:

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

我使用MySQL作为数据库。 我正在尝试使用CASE语句。

干杯!

是的,这样的事情:

 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()函数,可以使用较less的冗长语法来执行此操作。 我通常会尽量避免这种情况,因为它是SQL的一个特定于MySQL的扩展,在其他地方通常不受支持。 CASE是标准的SQL,并且在不同的数据库引擎中可移植性更高,我倾向于尽可能编写可移植的查询,只有在便携式替代方法相当慢或不太方便时才使用引擎特定的扩展。

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 

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

这应该工作:

 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 

还有一点需要注意的是,MySQL有两种不同的CASE:像@cdhowie和其他人在这里描述的(在这里进行了描述: http ://dev.mysql.com/doc/refman/5.7/en/control-flow -functions.html#operator_case )和一些被称为CASE的东西,但是它们的语法和function完全不同,在这里logging: https : //dev.mysql.com/doc/refman/5.0/en/case.html

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

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

句法:

  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,并在大多数数据库中工作。