Использование условия IN для оператора Case When Oracle SQL - PullRequest
0 голосов
/ 16 июня 2020

Я хотел бы использовать предложение IN с оператором Case для моего отчета Oracle.

У меня есть параметр, который использует 20 января, 20 февраля и т. Д.

Когда я выбираю 20 апреля, я хочу получить строки для 20 января, 20 февраля, 20 марта и 20 апреля. Если я выберу 20 января, я хотел бы получить строки только за 20 января.

Я планирую использовать оператор CASE WHEN.

План был ниже:

WHERE GL.periodname IN
CASE WHEN :Parameter = 'Jan-20' THEN 'Jan-20'
CASE WHEN :Parameter = 'Feb-20' THEN 'Jan-20'
CASE WHEN :Parameter = 'Feb-20' THEN 'Feb-20'
CASE WHEN :Parameter = 'Mar-20' THEN 'Jan-20'
CASE WHEN :Parameter = 'Mar-20' THEN 'Feb-20'
CASE WHEN :Parameter = 'Mar-20' THEN 'Mar-20'

и т. Д.

Кто-нибудь знает альтернативу, поскольку она, кажется, работает только с одним и тем же предложением WHEN?

Любая помощь будет принята с благодарностью!

Ответы [ 2 ]

2 голосов
/ 16 июня 2020

Просто преобразуйте в даты:

where to_date(gl.periodname, 'Mon-RR') <= to_date(:Parameter, 'Mon-RR')

(Примечание: вам может потребоваться также принять во внимание год. Это не ясно.)

Я бы действительно рекомендовал сохранить имя периода в формате ГГГГ-ММ ("2020-01"), а не в том виде, как вы это делаете.

Затем, если вы передадите параметр в том же формате, вы можете просто использовать сравнение строк:

where gl.PeriodName <= :Parameter 
0 голосов
/ 18 июня 2020

В вашем описании указано, что вы ищете диапазон значений дат. А именно с января по месяц параметра, указанный в параметре. В таком случае оператор Case не даст вам того, что вы хотите, поскольку он может вернуть только одно значение. Поскольку вы ищете диапазон дат, преобразуйте столбец названия периода и параметр в даты. См. Скрипку .

with parameter as
     ( select to_date('&MonYr','Mon-rr') ep from dual )
   , period ( start_period, end_period) as 
     ( select trunc(ep,'year'), ep from parameter )
select period_name  
  from gl
  join period 
    on to_date(period_name,'Mon-rr') between start_period and end_period;

Я бы сделал go на шаг дальше, чем @Gordon, и просто сохранил бы это как DATE. Если вам действительно нужен часто используемый формат Mon_rr, добавьте его в виртуальный столбец. Итак:

create table gl (
       period_date date
     , period_name varchar2(16) 
          generated always as (to_char(period_date, 'Mon-rr')) virtual );
...