「SELECT」ステートメントの「IF」-列の値に基づいて出力値を選択します


685
SELECT id, amount FROM report

私は必要なamountことamountならばreport.type='P'-amount場合report.type='N'。これを上記のクエリに追加するにはどうすればよいですか?

回答:


1025
SELECT id, 
       IF(type = 'P', amount, amount * -1) as amount
FROM report

http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.htmlを参照してください。

さらに、条件がnullの場合にも処理できます。金額がヌルの場合:

SELECT id, 
       IF(type = 'P', IFNULL(amount,0), IFNULL(amount,0) * -1) as amount
FROM report

部分IFNULL(amount,0)、amountがnullでない場合に戻り値を意味し、それ以外の場合は0を返します


5
ここでCOALESCEの代わりにこのIFNULLを使用する利点はあるのでしょうか?
クリス

4
mysqlソースから、合体の2つの定義に気づきました。1つは2つの引数を持ち、もう1つは引数のリストを持っていますが、ifnullは2つのパラメーターを使って合体を呼び出しますsql/item_cmpfunc.h 722: Item_func_ifnull(Item *a, Item *b) :Item_func_coalesce(a,b) {}
Felipe Buccioni

2
「N」および「P」以外のレポートタイプがある場合、答えは正しくありません。より良い「ケースステートメント」ソリューションでBadHorsieのコメントを参照してください。
Trygve

3
@Trygve質問は2つの条件に対するものであり、IFステートメントを探していますが、何が問題なのですか?
フェリペブッチョーニ2017年

2
@Felipe、答えは必ずしも100%正しいとは限りません。NとP以外のレポートタイプが存在する可能性があります。この場合、レポートタイプ(例として)が「E」の場合、-amountを選択すると、エラーが発生する可能性があります。ただし、他の種類のレポートがあるかどうかは質問に含まれていないため、反対票を削除します。私はこれらの場合に防御的にプログラムするのが好きなので、他の読者に向かいます。
Trygve

255

caseステートメントを使用します。

select id,
    case report.type
        when 'P' then amount
        when 'N' then -amount
    end as amount
from
    `report`

5
@エヴァン:そうです。わかりやすくするために使用しています。それはとにかく何かに影響するということではありません。
mellamokb、2011年

3
特定のデータベースでは、カスタム構文よりもANSI標準構文を優先します。
ゴードンリノフ2014年

2
report.typeに他の値がある場合、または新しいreport.typeが後日導入される場合、承認された回答ソリューションは必ずしも適切ではないため、これは最良のソリューションです。それは言っていif report.type = 'P' use amount, otherwise use -amount for anything elseます。タイプが「P」でない場合、タイプは考慮されません。
BadHorsie 2015年

97
SELECT CompanyName, 
    CASE WHEN Country IN ('USA', 'Canada') THEN 'North America'
         WHEN Country = 'Brazil' THEN 'South America'
         ELSE 'Europe' END AS Continent
FROM Suppliers
ORDER BY CompanyName;


15

最も簡単な方法はIF()を使用することです。はいMysqlでは条件付きロジックを実行できます。IF関数は、3つのパラメーターCONDITION、TRUE OUTCOME、FALSE OUTCOMEを取ります。

だからロジックは

if report.type = 'p' 
    amount = amount 
else 
    amount = -1*amount 

SQL

SELECT 
    id, IF(report.type = 'P', abs(amount), -1*abs(amount)) as amount
FROM  report

+ veのみの場合は、abs()をスキップできます


12
SELECT id, amount
FROM report
WHERE type='P'

UNION

SELECT id, (amount * -1) AS amount
FROM report
WHERE type = 'N'

ORDER BY id;

結果セットは相互に排他的であるため、ここではUNION ALLを使用します。
Arth

4

あなたもこれを試すことができます

 SELECT id , IF(type='p', IFNULL(amount,0), IFNULL(amount,0) * -1) as amount FROM table
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.