Запрос представления Oracle с одним условием, на основе которого извлекаются данные, но не извлекается одна строка - PullRequest
0 голосов
/ 07 января 2019

Следующий запрос:

    SELECT XALDV.EMPLOYEE_NUMBER,
              TO_CHAR (XALDV.HIRE_DATE ,'YYYY/MM/DD HH:MI:SS AM'),
              XALDV.HOLDER_NAME,
              XALDV.BUSINESS_LINE1,
              TO_CHAR (XALDV.ISSUE_DATE ,'YYYY/MM/DD HH:MI:SS AM'),
              XALDV.LICENSE_DESCRIPTION,
              XALDV.BUSINESS_LINE2,
              XALDV.LICENSE_NO,
              XALDV.BUSINESS_LINE3,
              XALDV.BUSINESS_LINE4,
              XALDV.LICENSE_TITLE,
              XALDV.BUSINESS_LINE5,
              XALDV.LICENSE_TYPE,
              XALDV.LIC_AUTHORITY_NAME,
              XALDV.LIC_CATEGORY_NAME,
              XALDV.LIC_HOLDER_TYPE,
              XALDV.LIC_PROJECT_NAME,
              XALDV.LIC_REGION_NAME,
              XALDV.LIC_STATUS_NAME,
              XALDV.LOA_STATUS,
              XALDV.MASTEC_ORG,
              TO_CHAR (XALDV.RENEWAL_DATE ,'YYYY/MM/DD HH:MI:SS AM'),
              XALDV.STATE details ,
              null publish_cols
FROM   APPS.XXMTZ_AT_LIC_DTL_V XALDV 
WHERE  1=1
AND   '05-JAN-2019' BETWEEN issue_date AND NVL(RENEWAL_DATE,SYSDATE) 

Проблема, связанная с отсутствием одной конкретной строки, связана с нулевым значением в Renewal_date.

Я пытался использовать NVL, поскольку он есть в моем примере кода, но это не дает мне эту конкретную строку.

Пожалуйста, помогите мне, что можно сделать?

Ответы [ 2 ]

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

Не используйте BETWEEN с датами! Это особенно важно в Oracle, где тип данных DATE имеет компонент времени - видите ли вы его или нет.

Итак, я бы порекомендовал:

( (issue_date IS NULL OR issue_date >= DATE '2019-01-05') AND
  (renewal_date IS NULL OR renewal_date < sysdate)
)
0 голосов
/ 07 января 2019

issue_date также имеет нулевое значение для этой конкретной записи.

Вы выполняете запрос ниже

select 1 
  from dual
 where '05-JAN-2019' between NULL and NVL(NULL, sysdate)

Вы не можете ожидать, что выше будет возвращать какие-либо записи, так как 05-JAN-2019 не находится между NULL и любым значением. Он даже не сравнивается как даты, так как одно из сравниваемых значений - NULL.

Однако, если вы выполните приведенный ниже запрос, он выдаст вам запись, так как теперь вы добавили условие NVL, чтобы позаботиться о NULL.

select 1 
  from dual
 where date '2019-01-01' between NVL(NULL,'01-jan-1950') and NVL(null, sysdate)

Решение для вашего запроса - это то, что вы должны решить, основываясь на значениях, которые вы ожидаете, что запрос вернет

WHERE  1=1
  AND   '05-JAN-2019' BETWEEN NVL(issue_date,'05-JAN-2019') AND NVL(RENEWAL_DATE,SYSDATE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...