#oracle #case
#Oracle #case
Вопрос:
Как мне проверить наличие нескольких вещей в моем операторе case, не записывая несколько строк, проверяя каждый случай.
Я попробовал это, и это очень некрасиво.
Я хочу что-то чистое, как показано ниже, но не могу заставить его работать.
select CASE
WHEN (UPPER(NAME) IN ('%AVG%', '%AVERAGE%') AND
FORMATTED_ENTRY NOT IN('<', '>'))
THEN FORMATTED_ENTRY END actual_avg
FROM VALUES_TABLE
Комментарии:
1. вы не можете использовать подстановочный знак% без like внутри IN, они должны быть отдельными. Однако это может быть возможно с использованием регулярных выражений. docs.oracle.com/cd/B12037_01/appdev.101/b10795/adfns_re.htm
2. Почему этот подход не работает — вы получаете ошибку или неправильные результаты? То, что вы показали, выглядит нормально, за исключением того, что вы используете подстановочные знаки в
IN
-, которые вы заменяетеOR
. Может быть, показ вашей версии ‘multiple lines’ прояснит проблему, с которой вы столкнулись?3. Да, вы не можете использовать подстановочные знаки (
%
) вIN
предложении, но что вы можете сделать, так это использоватьregexp_like()
функцию регулярного выражения (Oracle 10g и выше). Вот небольшой пример .
Ответ №1:
Предполагая, что вы хотите сопоставление подстановочных знаков для этих знаков процента:
CASE WHEN (
( UPPER(NAME) LIKE '%AVG%' OR UPPER(NAME) LIKE '%AVERAGE%' )
AND FORMATTED_ENTRY NOT IN('<', '>')
)
THEN FORMATTED_ENTRY END actual_avg