Есть ли способ добавить заявление в случае - когда в оракуле - PullRequest
0 голосов
/ 27 сентября 2019

Так что я пытаюсь добавить «И» в моем операторе выбора, если входной параметр: STATUS! = Null.На данный момент я пришел к этому

... WHERE NSR_DATCRE BETWEEN to_date(:NUMDAYS1, 'DD.MM.RRRR') 
AND to_date(:NUMDAYS2, 'DD.MM.RRRR')
AND 
  CASE WHEN :STATUS = null then NSR_STATUS != 1 
  else NSR_STATUS = :STATUS
AND NVL(NSR_MAGAZ,-1) ...

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

... WHERE NSR_DATCRE BETWEEN to_date(:NUMDAYS1, 'DD.MM.RRRR') AND to_date(:NUMDAYS2, 'DD.MM.RRRR')
AND (NSR_STATUS = :STATUS AND :STATUS != null) or (NSR_STATUS != 1 AND :STATUS = null)
AND NVL(NSR_MAGAZ,-1) ...

Я действительно застрялсейчас.Есть предложения?

Ответы [ 2 ]

1 голос
/ 27 сентября 2019

Выражения CASE должны возвращать значение, а не логическое выражение:

... WHERE NSR_DATCRE BETWEEN to_date(:NUMDAYS1, 'DD.MM.RRRR') AND
          to_date(:NUMDAYS2, 'DD.MM.RRRR') AND 
          1 = CASE
                WHEN :STATUS IS NULL AND NSR_STATUS != 1 THEN 1
                WHEN NSR_STATUS = :STATUS THEN 1
                ELSE 0
              END AND
          NVL(NSR_MAGAZ,-1) ...
1 голос
/ 27 сентября 2019

Помимо комментариев Ника, также используйте круглые скобки при смешивании AND & OR.

ИЛИ имеет более низкий приоритет, чем AND, и всегда будет обрабатываться последним, если вы не используете скобки.

... WHERE NSR_DATCRE BETWEEN to_date(:NUMDAYS1, 'DD.MM.RRRR') AND to_date(:NUMDAYS2, 'DD.MM.RRRR')
AND (
     (NSR_STATUS = :STATUS AND :STATUS is not null) 
     or (NSR_STATUS != 1 AND :STATUS is null)
    )
AND NVL(NSR_MAGAZ,-1) = ?? ...

Ваш оператор CASE не работал, потому что CASE не может вернуть логическое значениеусловия (1=1, NSR_STATUS != 1 и т. д.).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...