次の定義を持つ「tbl_transaction」というデータベーステーブルがあります。
id INT(11) Primary Key
action_type ENUM('Expense', 'Income')
action_heading VARCHAR (255)
action_amount FLOAT
Income Amt
とExpense Amt
の2つの列を生成します。
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()
関数もあります。他の場所では一般的にサポートされていない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
注意すべきもう1つの点は、MySQLには2つの異なるCASEがあることです。1つは@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
常に、最初に使用したいときにもう一方を使用します。
これにより正しいソリューションが提供されることを願っています。
構文:
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;
ここでは、if-then-else
よりも柔軟性が高いため、CASE
ステートメントを使用しています。複数のブランチを許可します。 CASE
ステートメントは標準SQLであり、ほとんどのデータベースで機能します。