2017-02-15 3 views
0

Я пытаюсь отфильтровать свой запрос, зависит от того, что пользователь выбрал в период (месяц или год) Я извлекаю параметр через BIRT.Как мы можем отфильтровать запрос, который зависит от параметра, который пользователь выбирает?

Мой запрос:

SELECT DATE 
FROM TABLE 
WHERE Year(DATE) = Year(CURRENT_TIMESTAMP) AND Month(DATE) = Month(CURRENT_TIMESTAMP) 

Мой результат:

DATE 
2017-02-14 
2017-02-14 
2017-02-14 
2017-02-14 
2017-02-14 
2017-02-14 
2017-02-14 
2017-02-01 
2017-02-02 

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

DATE 
2017-02-14 
2017-02-14 
2017-02-14 
2017-02-14 
2017-02-14 
2017-02-14 
2017-02-14 
2017-01-25 
2017-01-26 
2017-02-01 
2017-02-02 
2017-01-20 
2017-01-20 
2017-01-20 
2017-01-20 
2017-01-20 
2017-01-20 
2017-01-20 
2017-01-20 
2017-01-20 

Я попытался с ДЕЛУ как:

CASE WHEN USER_PARAM = 'month' then Month(DATE) = Month(CURRENT_TIMESTAMP) END 

Очевидно, что это не хорошо, я попытался с И/ИЛИ как:

Year(DATE) = Year(CURRENT_TIMESTAMP) 
    OR ('USER_PARAM' = 'MONTH' AND Month(DATE) = Month(CURRENT_TIMESTAMP)) 

Если 'USER_PARAM' = 'MONTH' верно -> Это не работает, потому что у меня есть все эти годы (не текущий)

Year(DATE) = Year(CURRENT_TIMESTAMP) 
    AND ('USER_PARAM' = 'MONTH' AND Month(DATE) = Month(CURRENT_TIMESTAMP)) 

'USER_PARAM' = 'MONTH' Если это ложно> Это не работает, потому что у меня нет никаких данных

ответ

1

Вы только перевернул ваше состояние.
Замените «MONTH» на «YEAR» и измените «AND» на «OR», и вы хорошо пойдете.

Year(DATE) = Year(CURRENT_TIMESTAMP) 
AND ('USER_PARAM' = 'YEAR' OR Month(DATE) = Month(CURRENT_TIMESTAMP)) 
+0

Большое спасибо за вашу помощь! Я был на этом блоке ... близко, но заблокирован – Bob

1

Лучший способ работы с пользовательскими параметрами, которые не являются обязательными (я считаю), чтобы нулевой быть джокером или по умолчанию.

Так что если у вас есть параметр @month, который может быть нулевым, тогда следующий будет работать

WHERE MONTH(DATE) = COALESCE(@month,MONTH(DATE)) 

С этим утверждением, если @month равно нулю, то все совпадает иначе он фильтрует

Так что, если вам хочу только текущий месяц по умолчанию вы можете использовать

WHERE MONTH(DATE) = COALESCE(@month,MONTH(CURRENT_TIMESTAMP)) 

Конечный, где оператор будет выглядеть следующим образом:

WHERE YEAR(DATE) = COALESCE(@year,YEAR(CURRENT_TIMESTAMP)) 
    AND MONTH(DATE) = COALESCE(@month,MONTH(CURRENT_TIMESTAMP)) 
+0

Спасибо за вашу помощь. Мой параметр не является необязательным: он может иметь значение «месяц» или «год», но не пустое или пустое. Это обязательно. Какое оптимальное решение? Я понимаю ответ AXMIM, потому что я был таким же образом. – Bob

+1

@FannyV - если бы это был я, я бы использовал указанный выше запрос и задал год или месяц не нулевому значению в зависимости от индикатора, поскольку большинство систем оптимизировано для того, чтобы сделать коалесценцию быстрее, чем ИЛИ – Hogan

Смежные вопросы