Несколько значений в декодировании Oracle SQL - PullRequest
0 голосов
/ 21 сентября 2018

У меня простой вопрос, но я не могу найти решение.Мне нужно:

WHERE
(tableABC.name = (DECODE (:p_type,'Morning', 'GOODMORNING',
                                  'Afternoon', 'GOODAFTERNOON',
                                  'Day', IN('GOODMORNING','GOODAFTERNOON'))

К сожалению, это не работает.Я не могу использовать любую другую таблицу, потому что она используется в отчете, а «Утро, День, День» - воображаемые слова (это должно быть удобно для пользователя).Секунды действительно существуют в таблице, но есть также много следующих значений для этого столбца (например: «GOODEVENING», «GOODNIGHT»).Мне нужно выбрать только два значения из определенного столбца с множеством различных значений, которые будут выбраны в разделе «День».

Большое спасибо, D.

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Не используйте decode().Даже не используйте case.Просто выразите это как логическую логику:

WHERE (:p_type = 'Morning' AND tableABC.name = 'GOODMORNING') OR
      (:p_type = 'Afternoon' AND tableABC.name = 'GOODAFTERNOON') OR
      (:p_type = 'Day' AND tableABC.name IN ('GOODMORNING', 'GOODAFTERNOON'))
0 голосов
/ 21 сентября 2018

Вы не можете изменить условие сравнения с = на IN в середине, как это.Вы можете достичь своей цели, просто переключившись на простую логическую логику:

WHERE (:p_type = 'Morning' AND tableABC.name = 'GOODMORNING')
   OR (:p_type = 'Afternoon' AND tableABC.name = 'GOODAFTERNOON')
   OR (:p_type = 'Day' AND tableABC.name IN ('GOODMORNING', 'GOODAFTERNOON'))

с дополнительным набором скобок, охватывающих все это, если у вас есть другие условия:

WHERE ((:p_type = 'Morning' AND tableABC.name = 'GOODMORNING')
    OR (:p_type = 'Afternoon' AND tableABC.name = 'GOODAFTERNOON')
    OR (:p_type = 'Day' AND tableABC.name IN ('GOODMORNING', 'GOODAFTERNOON')))
AND <something else>
...