Проверка наличия нескольких значений в инструкции CASE

#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