|
条件によって置き換える (CASE,DECODE,IIF,IF)
―ORACLEの場合―
条件によって返す値を置き換えるには、CASE,DECODEを利用します。
CASEには、ある項目・値・式との一致の比較をする「単純CASE式」と、
評価式を複数記述する「検索CASE式」があります。
一方DECODEは基本的に、ある項目・値・式との一致を比較します。
単純CASE式
文法:CASE <比較元の列名、式、値など>
WHEN <比較する列名、式、値など> THEN <返す列名、式、値など>
[WHEN <比較する列名、式、値など> THEN <返す列名、式、値など>]
[ELSE <上記に該当しない場合に返す列名、式、値など>]
END
|
※ELSEを省略した場合は、WHENに該当しなければNULLを返します
検索CASE式
文法:CASE
WHEN <比較式など> THEN <返す列名、式、値など>
[WHEN <比較式など> THEN <返す列名、式、値など>]
[ELSE <上記に該当しない場合に返す列名、式、値など>]
END
|
※ELSEを省略した場合は、WHENに該当しなければNULLを返します
DECODE
文法:DECODE(<比較元の列名、式、値など>,
<比較する列名、式、値など>, <返す列名、式、値など>
[,<比較する列名、式、値など>, <返す列名、式、値など>…]
[,<上記に該当しない場合に返す列名、式、値など>]
)
|
※<上記に該当しない場合に返す列名、式、値など>を省略した場合は、
全てに該当しなければNULLを返します
―SQL Serverの場合―
条件によって返す値を置き換えるには、CASE,IIFを利用します。
(IIFはSQL Server 2012で対応)
CASEには、ある項目・値・式との一致の比較をする「単純CASE式」と、
評価式を複数記述する「検索CASE式」があります。
一方IIFは、ブール式(True/Falseを返す式)の条件がTrueかFalseかで返す値を置き換えるものです。
単純CASE式
文法:CASE <比較元の列名、式、値など>
WHEN <比較する列名、式、値など> THEN <返す列名、式、値など>
[WHEN <比較する列名、式、値など> THEN <返す列名、式、値など>]
[ELSE <上記に該当しない場合に返す列名、式、値など>]
END
|
※ELSEを省略した場合は、WHENに該当しなければNULLを返します
検索CASE式
文法:CASE
WHEN <比較式など> THEN <返す列名、式、値など>
[WHEN <比較式など> THEN <返す列名、式、値など>]
[ELSE <上記に該当しない場合に返す列名、式、値など>]
END
|
※ELSEを省略した場合は、WHENに該当しなければNULLを返します
IIF
文法:IIF(<ブール式の条件>,
<Trueの場合に返す列名、式、値など>,
<Falseの場合に返す列名、式、値など>
)
|
―PostgreSQLの場合―
条件によって返す値を置き換えるには、CASEを利用します。
CASEには、ある項目・値・式との一致の比較をする「単純CASE式」と、
評価式を複数記述する「検索CASE式」があります。
単純CASE式
文法:CASE <比較元の列名、式、値など>
WHEN <比較する列名、式、値など> THEN <返す列名、式、値など>
[WHEN <比較する列名、式、値など> THEN <返す列名、式、値など>]
[ELSE <上記に該当しない場合に返す列名、式、値など>]
END
|
※ELSEを省略した場合は、WHENに該当しなければNULLを返します
検索CASE式
文法:CASE
WHEN <比較式など> THEN <返す列名、式、値など>
[WHEN <比較式など> THEN <返す列名、式、値など>]
[ELSE <上記に該当しない場合に返す列名、式、値など>]
END
|
※ELSEを省略した場合は、WHENに該当しなければNULLを返します
―MySQLの場合―
条件によって返す値を置き換えるには、CASE,IFを利用します。
CASEには、ある項目・値・式との一致の比較をする「単純CASE式」と、
評価式を複数記述する「検索CASE式」があります。
一方IFは、ブール式(True/Falseを返す式)の条件がTrueかFalseかで返す値を置き換えるものです。
単純CASE式
文法:CASE <比較元の列名、式、値など>
WHEN <比較する列名、式、値など> THEN <返す列名、式、値など>
[WHEN <比較する列名、式、値など> THEN <返す列名、式、値など>]
[ELSE <上記に該当しない場合に返す列名、式、値など>]
END
|
※ELSEを省略した場合は、WHENに該当しなければNULLを返します
検索CASE式
文法:CASE
WHEN <比較式など> THEN <返す列名、式、値など>
[WHEN <比較式など> THEN <返す列名、式、値など>]
[ELSE <上記に該当しない場合に返す列名、式、値など>]
END
|
※ELSEを省略した場合は、WHENに該当しなければNULLを返します
IF
文法:IF(<ブール式の条件>,
<Trueの場合に返す列名、式、値など>,
<Falseの場合に返す列名、式、値など>
)
|
***例1***
・性別コードが1の場合は"男性"、2の場合は"女性"、それ以外は"不明"を返す
[社員マスタ]
社員コード |
氏名 |
性別コード |
001 |
テスト一郎 |
1 |
002 |
テスト花子 |
2 |
003 |
テスト二郎 |
0 |
004 |
テスト桜子 |
2 |
[実行SQL]
--単純CASE式(Oracle,SQL Server,PostgreSQL,MySQL)--
SELECT
社員コード, 氏名,
(CASE 性別コード
WHEN 1 THEN '男性'
WHEN 2 THEN '女性'
ELSE '不明'
END) AS 性別
FROM
社員マスタ
|
--検索CASE式(Oracle,SQL Server,PostgreSQL,MySQL)--
SELECT
社員コード, 氏名,
(CASE
WHEN 性別コード = 1 THEN '男性'
WHEN 性別コード = 2 THEN '女性'
ELSE '不明'
END) AS 性別
FROM
社員マスタ
|
--DECODE(Oracle)--
SELECT
社員コード, 氏名,
DECODE(性別コード, 1, '男性', 2, '女性', '不明') AS 性別
FROM
社員マスタ
|
--IIF(SQL Server)--
SELECT
社員コード, 氏名,
IIF(性別コード = 1, '男性',
IIF(性別コード = 2, '女性', '不明')) AS 性別
FROM
社員マスタ
|
--IF(MySQL)--
SELECT
社員コード, 氏名,
IF(性別コード = 1, '男性',
IF(性別コード = 2, '女性', '不明')) AS 性別
FROM
社員マスタ
|
[結果]
社員コード |
氏名 |
性別 |
001 |
テスト一郎 |
男性 |
002 |
テスト花子 |
女性 |
003 |
テスト二郎 |
不明 |
004 |
テスト桜子 |
女性 |
***例2***
・売上金額が5,000円以上はAを、2,000円以上はBを、それ以外はCを返す
[売上表]
商品名 |
売上金額 |
りんご |
2500 |
みかん |
1200 |
ぶどう |
3000 |
バナナ |
8000 |
[実行SQL]
--検索CASE式(Oracle,SQL Server,PostgreSQL,MySQL)--
SELECT
商品名, 売上金額,
(CASE
WHEN 売上金額 >= 5000 THEN 'A'
WHEN 売上金額 >= 2000 THEN 'B'
ELSE 'C'
END) AS ランク
FROM
売上表
|
--DECODE(Oracle)--
SELECT
商品名, 売上金額,
DECODE(SIGN(売上金額 - 5000),
1, 'A',
0, 'A',
DECODE(SIGN(売上金額 - 2000), 1, 'B', 0, 'B', 'C')
) AS ランク
FROM
売上表
|
※SIGNは引数がマイナスなら-1を、0なら0を、プラスなら1を返す関数
--IIF(SQL Server)--
SELECT
商品名, 売上金額,
IIF(売上金額 >= 5000, 'A',
IIF(売上金額 >= 2000, 'B', 'C')) AS ランク
FROM
売上表
|
--IF(MySQL)--
SELECT
商品名, 売上金額,
IF(売上金額 >= 5000, 'A',
IF(売上金額 >= 2000, 'B', 'C')) AS ランク
FROM
売上表
|
[結果]
商品名 |
売上金額 |
ランク |
りんご |
2500 |
B |
みかん |
1200 |
C |
ぶどう |
3000 |
B |
バナナ |
8000 |
A |
|
<<PR>>
価格:300円
価格:300円
|