Оператор Case в MySQL
есть таблица 'tbl_transaction С
id INT(11) Primary Key
action_type ENUM('Expense', 'Income')
action_heading VARCHAR (255)
action_amount FLOAT
можно ли получить результат, используя только SQL-запрос, перечисляющий всю сумму расходов в столбце расходов Amt и сумму дохода в столбце доходов Amt, например:
ID Heading Income Amt Expense Amt
1 ABC 1000 -
2 XYZ - 2000
Я использую MySQL в качестве базы данных. И я пытаюсь использовать CASE statement.
Ура!
6 ответов
Да, что-то вроде этого:
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 и гораздо более переносимым для разных ядер баз данных, и я предпочитаю писать переносимые запросы как можно больше, ТОЛЬКО используя расширения для конкретных движков, когда портативная альтернатива значительно медленнее или менее удобно.
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: одним нравится то, что @cdhowie и другие здесь описывают (и документально здесь: http://dev.mysql.com/doc/refman/5.7/en/control-flow-functions.html#operator_case) и то, что называется случай, но имеет совершенно иной синтаксис и совершенно иные функции, подтвержденные документально здесь: https://dev.mysql.com/doc/refman/5.0/en/case.html
неизменно, я сначала использую один, когда я хочу другую.
Я надеюсь, что это предоставит вам правильное решение:
синтаксис:
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 и работает в большинстве баз данных.