web-dev-qa-db-ja.com

MySQLのCaseステートメント

次の定義を持つ「tbl_transaction」というデータベーステーブルがあります。

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

Income AmtExpense Amtの2つの列を生成します。

SQLクエリのみを使用して、条件付きで列にデータを入力することは可能ですか?その結果、費用項目または収入項目に応じて、出力が正しい列に表示されますか?

例えば:

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

データベースとしてMySQLを使用しています。これを実現するためにCASEステートメントを使用しようとしています。

乾杯!

54
Pradip Kharbuja

はい、このようなもの:

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であり、さまざまなデータベースエンジン間ではるかに移植性が高く、移植性のある代替がかなり遅い場合にのみ、エンジン固有の拡張機能を使用して、移植性の高いクエリをできる限り作成す​​ることを好みます以下の利便性。

135
cdhowie

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
21

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
8
Riho

これは動作するはずです:

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
3

注意すべきもう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

常に、最初に使用したいときにもう一方を使用します。

2
nomadkbro

これにより正しいソリューションが提供されることを願っています。

構文:

   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であり、ほとんどのデータベースで機能します。

0
Sushmita Konar