CASE 式¶
CASE
句では、 if-then-else 型の論理を指定します。
CASE <value:expression> WHEN <compare_value:expression>
THEN result [ WHEN <compare_value:expression> THEN result ...]
[ ELSE result ]
END
CASE WHEN <condition>
THEN result [ WHEN <condition> THEN result ...]
[ ELSE result ]
END
<condition> ::=
<condition> AND <condition>
| <condition> OR <condition>
| NOT <condition>
| ( <condition> )
| <value> <binary operator> <value> [ , <value> ]*
| <value> <binary operator> ( <value> [ , <value> ]* )
| <value> BETWEEN <value> AND <value>
| <value> <unary operator>
CASE
句は、以下の 2 つの方法で使用できます。
CASE
で式を評価し、値を取得します。つづいて、その値を各WHEN
句の式と比較します。一致が見つかると 結果 値が返されます。一致が見つかるまで
CASE
で各WHEN
句の条件を評価します。一致が見つかると 結果 値が返されます。
どちらの場合も、 ELSE
句がなく、一致が見つからなければ、 CASE
から NULL
が返されます。
すべての 結果 式は、型に整合性があることが必要です。たとえば、1 つの 結果 を boolean 型として、もう 1 つの結果を integer 型とすることはできません。ただし、1 つの 結果 を integer 型、もう 1 つの結果を float 型とすることはできます。
CASE 句の例¶
以下のように internet_inc
というビューがあるとします。
id | summary |
ttime |
taxid |
|
---|---|---|---|
1 |
Error in ADSL router |
2005-06-29 19:19:41.0 |
B78596011 |
2 |
Incident in ADSL router |
2005-06-29 19:19:41.0 |
B78596012 |
3 |
Install additional line |
2005-06-29 19:19:41.0 |
B78596013 |
4 |
Bandwidth increase |
2005-06-29 19:19:41.0 |
B78596014 |
例 1
SELECT id
, summary
, CASE
WHEN LEN(summary) > 22
THEN summary
ELSE id
END
FROM internet_inc
id |
summary |
case |
---|---|---|
1 |
Error in ADSL router |
1 |
2 |
Incident in ADSL router |
Incident in ADSL router |
3 |
Install additional line |
Install additional line |
4 |
Bandwidth increase |
4 |
例 2
SELECT id
, CASE
WHEN id = 1 THEN true
ELSE id
END AS is_first
FROM internet_inc
Error executing sentence: Incorrect select sentence: CASE argument
IINC_ID is not compatible with the rest of values.
WHEN
句の 結果 の型は ELSE 句の結果の型と互換性がありません。最初の型は boolean 型で、その他は long 型です。
例 3
SELECT id
,CASE
WHEN id = 1
THEN 'first'
ELSE id
END AS is_first
FROM internet_inc
id |
is_first |
---|---|
1 |
first |
2 |
2 |
3 |
3 |
4 |
4 |
注釈
WHEN
句または ELSE
句の 結果 の型が同じでない場合、有効な結果を取得するために結果は自動的に変換されます。この場合、 結果 は String に変換されます。
例 4
CASE 句はクエリの WHERE 部分で使用することもできます。
SELECT *
FROM internet_inc
WHERE true = (
CASE id
WHEN 1
THEN true
ELSE false
END
)
id |
summary |
ttime |
taxid |
---|---|---|---|
1 |
Error in ADSL router |
2005-06-29 19:19:41.0 |
B78596011 |
例 5
以下の 2 つのクエリは同等で、同じ結果が取得されますが、異なる方法で CASE
を使用しています。
SELECT id
, CASE id
WHEN CASE id
WHEN 1
THEN 1
ELSE 2
END
THEN 'first'
WHEN 2
THEN 'second'
ELSE 'other'
END
FROM internet_inc;
SELECT id
, CASE id
WHEN CASE
WHEN id = 1
THEN 1
ELSE 2
END
THEN 'first'
WHEN 2
THEN 'second'
ELSE 'other'
END
FROM internet_inc;
id |
case |
---|---|
1 |
first |
2 |
first |
3 |
other |
4 |
other |
注釈
CASE は、最初に true に評価された WHEN
句の結果を返します。この例では、最初の WHEN
条件も 2 番目の条件も true ですが、最初の結果が返されます。