В этом учебном пособии вы узнаете, как использовать оператор CASE в Oracle/PLSQL c синтаксисом и примерами.
Описание
В Oracle/PLSQL оператор CASE имеет функциональность IF-THEN-ELSE. Начиная с Oracle 9i, вы можете использовать оператор CASE в SQL предложении.
Синтаксис
Синтаксис оператора CASE в Oracle/PLSQL:
WHEN condition_1 THEN result_1
WHEN condition_2 THEN result_2
...
WHEN condition_n THEN result_n
ELSE result
END
Параметры или аргументы
- expression
- Не является обязательным. Это значение, которое вы сравниваете с условиями (то есть: condition_1 ... condition_n).
- condition_1 .. condition_n
- должны быть одного типа. Условия оцениваются по порядку, одно за другим. После того, как условие примет значение TRUE (истина), оператор CASE вернет результат, и не будет оценивать условия дальше.
- result_1 .. result_n
- все должны быть одного типа данных. Это значение возвращается единожды, когда condition примет TRUE (истина).
Примечание
- Если условие не примет TRUE, то оператор CASE вернет значение предложения ELSE.
- Если предложение ELSE опущено и условие не примет TRUE, то оператор CASE вернет NULL.
- Оператор CASE может иметь до 255 сравнений. Каждое предложение WHEN ... THEN рассматривает 2 сравнения.
Применение
Оператор CASE можно использовать в следующих версиях Oracle / PLSQL:
- Oracle 12c, Oracle 11g, Oracle 10g, Oracle 9i
Пример
Вы можете использовать оператор CASE в SQL предложении следующим образом:
1 2 3 4 5 6 7 |
SELECT table_name, CASE owner WHEN 'SYS' THEN 'The owner is SYS' WHEN 'SYSTEM' THEN 'The owner is SYSTEM' ELSE 'The owner is another value' END FROM all_tables; |
Или вы могли бы написать SQL запрос, используя оператор CASE следующим образом: (опустив expression в предложение WHEN .. THEN). Например:
1 2 3 4 5 6 7 |
SELECT table_name, CASE WHEN owner='SYS' THEN 'The owner is SYS' WHEN owner='SYSTEM' THEN 'The owner is SYSTEM' ELSE 'The owner is another value' END FROM all_tables; |
Эти два примера оператора CASE эквивалентны следующему условному оператору IF-THEN-ELSE:
1 2 3 4 5 6 7 |
IF owner = 'SYS' THEN result := 'The owner is SYS'; ELSIF owner = 'SYSTEM' THEN result := 'The owner is SYSTEM''; ELSE result := 'The owner is another value'; END IF; |
Оператор CASE будет сравнивать каждое значение owner, одно за другим.
Предложение ELSE в операторе CASE не является обязательным. Его можно опустить. Давайте посмотрим предыдущий SQL запрос с опущенным предложением ELSE.
SQL запрос будет выглядеть следующим образом:
1 2 3 4 5 6 |
SELECT table_name, CASE owner WHEN 'SYS' THEN 'The owner is SYS' WHEN 'SYSTEM' THEN 'The owner is SYSTEM' END FROM all_tables; |
С отсутствующим предложением ELSE, если ни одно из условий не приняло TRUE, оператор CASE вернет NULL.
Сравнивая 2 условия
Вот пример, который показывает, как использовать оператор CASE, чтобы сравнить различные условия:
1 2 3 4 5 6 |
SELECT CASE WHEN a < b THEN 'hello' WHEN d < e THEN 'goodbye' END FROM suppliers; |
Сравнение 2-х полей в одном предложении CASE:
1 2 3 4 5 6 |
SELECT supplier_id, CASE WHEN supplier_name = 'IBM' and supplier_type = 'Hardware' THEN 'North office' WHEN supplier_name = 'IBM' and supplier_type = 'Software' THEN 'South office' END FROM suppliers; |
Итак, если поле supplier_name = 'IBM' и поле supplier_type = 'Hardware', то оператор CASE вернет 'North office'. Если поле supplier_name = 'IBM' и supplier_type = 'Software', оператор CASE вернет 'South office'.