ГДЕ условия в SQL (ORACLE) - PullRequest
0 голосов
/ 25 января 2019

Люди, мне нужна помощь.

У меня есть следующий код:

    ...   WHERE res.cod_ordem_producao = pla.cod_ordem_producao -- TO MAKE THE JOIN
  AND (to_char(:codordemproducao)='X' -- INITIAL VALUE FOR THE PARAMETER
       AND to_char(:grau)='X') -- INITIAL VALUE FOR THE PARAMETER
  OR ((to_char(res.cod_ordem_producao) = to_char(:codordemproducao)
       AND to_char(:grau)='X'
       AND res.COD_ESTADO_TUBO IN ('G',
                                   'W')
       AND res.DTH_ENTRADA BETWEEN :dth_inicio AND :dth_final )
      OR (to_char(pla.dsc_aco) = to_char(:grau)
          AND to_char(:codordemproducao)='X'
          AND res.COD_ESTADO_TUBO IN ('G',
                                      'W')
          AND res.DTH_ENTRADA BETWEEN :dth_inicio AND :dth_final ))
ORDER BY res.DTH_ENTRADA

У нас есть 3 параметра здесь: DATE, CODORDEM, GRAU.Пользователь может ввести с помощью:

  1. ТОЛЬКО «дата» (без «GRAU» и «CODORDEM»)
  2. «Дата» И «grau» (без «CODORDEM»)
  3. 'date' И 'codordem' (без 'grau')

Где моя ошибка в коде?

Мой действительный код:1 - пользователь может ввести с датой + грау + кодорд 2 - пользователь может ввести с датой + грау

Ответы [ 3 ]

0 голосов
/ 25 января 2019

Переместить условие соединения в предложение соединения.Добавляйте критерий для дат всегда.Затем проверьте, являются ли оба оставшихся параметра нулевыми или только один из них, а второй встречен.

...
from res
join pla on res.cod_ordem_producao = pla.cod_ordem_producao
where res.dth_entrada between :dth_inicio and :dth_final
  and 
    (
      (:codordemproducao is null and :grau is null)
      or (
           (
             (:codordemproducao is null and to_char(pla.dsc_aco) = to_char(:grau))
             or 
             (:grau is null and to_char(res.cod_ordem_producao) = to_char(:codordemproducao))
           )
           and res.cod_estado_tubo in ('G', 'W')
         )
    )

Замените :parameter is null на to_char(:parameter) = 'X', если они отправлены как X с.Как я понял ситуация, когда вы предоставляете даты и оба оставшихся параметра запрещена.

0 голосов
/ 26 января 2019

Кажется, что условия неправильно объединены. Первое условие всегда присутствует (условие даты), а все остальные условия могут быть объединены оператором ИЛИ.

...   WHERE
res.cod_ordem_producao = pla.cod_ordem_producao 
AND res.DTH_ENTRADA BETWEEN :dth_inicio AND :dth_final
AND 
(
          (to_char(:codordemproducao)='X' AND to_char(:grau)='X') 
          OR 
          (to_char(res.cod_ordem_producao) = to_char(:codordemproducao) AND to_char(:grau)='X' AND res.COD_ESTADO_TUBO IN ('G', 'W'))
          OR 
          (to_char(pla.dsc_aco) = to_char(:grau) AND to_char(:codordemproducao)='X'  AND res.COD_ESTADO_TUBO IN ('G','W'))
)
ORDER BY res.DTH_ENTRADA
0 голосов
/ 25 января 2019

Я предполагаю, что пользователь может ввести один из трех параметров. Поэтому вам нужно добавить NVL к каждому условию, где у вас есть параметр, например:

res.DTH_ENTRADA BETWEEN :dth_inicio AND :dth_final

К

res.DTH_ENTRADA BETWEEN NVL(:dth_inicio,res.DTH_ENTRADA) AND NVL(res.DTH_ENTRADA,:dth_final)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...