具有一种条件的Oracle视图查询,该条件基于要检索的数据但不检索到的一行

时间:2019-01-07 07:04:31

标签: sql oracle oracle11g

以下是查询:

    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 :(得分:2)

  该特定记录的

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)

答案 1 :(得分:0)

请勿在日期中使用BETWEEN!这对于Oracle尤其重要,在Oracle中,DATE数据类型具有时间分量-无论您是否看到它。

所以,我建议:

( (issue_date IS NULL OR issue_date >= DATE '2019-01-05') AND
  (renewal_date IS NULL OR renewal_date < sysdate)
)