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 Amt
和 Expense 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语句的主要内容,如果未能解决你的问题,请参考以下文章