Oracle 中参数中具有空值的结果

Posted

技术标签:

【中文标题】Oracle 中参数中具有空值的结果【英文标题】:Results with empty values in parameter in Oracle 【发布时间】:2019-04-19 06:08:41 【问题描述】:

我正在为往返日期创建一个参数。记录中的某些日期缺失,这意味着存在空值。当我的参数在两个值之间搜索时,它会避免那些日期为空的结果,但我也想获取这些记录。

示例代码是,

AND TO_DATE(PLLA.PROMISED_DATE) 
    BETWEEN NVL (to_char(to_date(substr(:PROMISED_DATE_FROM, 1, 20), 'YYYY/MM/DD'), 'DD-MON-YY'), TO_DATE(PLLA.PROMISED_DATE)) 
        AND NVL (to_char(to_date(substr(:PROMISED_DATE_to, 1, 20), 'YYYY/MM/DD'), 'DD-MON-YY'), TO_DATE(PLLA.PROMISED_DATE)) 

【问题讨论】:

请添加代码和示例数据。 AND TO_DATE(PLLA.PROMISED_DATE) BETWEEN NVL (to_char(to_date(substr(:PROMISED_DATE_FROM,1,20),'YYYY/MM/DD'),'DD-MON-YY'), TO_DATE(PLLA.PROMISED_DATE)) 和 NVL (to_char(to_date(substr(:PROMISED_DATE_to,1,20),'YYYY/MM/DD'),'DD-MON-YY'),TO_DATE(PLLA.PROMISED_DATE)) 请参考我上面的第一条评论,谢谢。 为了将来参考,请编辑您的问题以包括澄清或进一步的信息。由于布局和格式不佳,尤其是在 cmets 中代码难以阅读。 另外,PLLA.PROMISED_DATE 真的没有用 DATE 数据类型定义吗?表现不佳。 【参考方案1】:

将 nvl 条件也添加到 PLLA.PROMISED_DATE...并尝试您的代码...

【讨论】:

我没明白。我只是想知道我该如何处理它。 如果您在 :promised_from 和 :promised_to 日期之间使用 NVL(PLLA.PROMISED_DATE,sysdate) - 输出会是什么?...尝试更新 @Tamil - “如果你在 :promised_from 和 :promised_to 日期之间使用 NVL(PLLA.PROMISED_DATE,sysdate) - 输出会是什么?” 嗯,我敢打赌,一个完全不可靠且几乎可以肯定是错误的结果集。 认为会发生什么? @APC,我只是建议在 plla.promised 日期使用 NVL...不是确切的命令...开发人员必须在不同的情况下进行试验和测试才能获得所需的输出.. .【参考方案2】:

如果您想包含 PLLA.PROMISED_DATE 为空的记录,那么您只需在 WHERE 子句中包含该条件:

AND ( PLLA.PROMISED_DATE is null or 
      TO_DATE(PLLA.PROMISED_DATE) BETWEEN NVL (to_char(to_date(substr(:PROMISED_DATE_FROM,1,20),'YYYY/MM/DD'),'DD-MON-YY'),TO_DATE(PLLA.PROMISED_DATE)) 
                                  and NVL (to_char(to_date(substr(:PROMISED_DATE_to,1,20),'YYYY/MM/DD'),'DD-MON-YY'),TO_DATE(PLLA.PROMISED_DATE)) 
)

您发布的示例代码真的很难理解。切换to_char()to_date() 始终是一个危险信号。如果 :PROMISED_DATE_FROM 和 :PROMISED_DATE_TO 作为实际日期传递会更好。但是,如果它们作为字符串传递,substr() 需要什么?如果传递的参数确实包含无关字符,为什么子字符串不是 10 个字符长,您在 to_date() 中使用的日期掩码的长度?

另外,当您将to_date() 应用于 PLLA.PROMISED_DATE 时,为什么还要将参数转回字符串?如果该列不是日期数据类型,这将是一个糟糕的显示,但至少您需要确保在 = 运算符的两侧比较相同的数据类型。

【讨论】:

以上是关于Oracle 中参数中具有空值的结果的主要内容,如果未能解决你的问题,请参考以下文章

关于Oracle数据库中SQL空值排序的问题

Spring JDBC为具有值的列返回空值

Oracle数据库 拾漏补缺

VBScript:将具有空值的参数传递给存储过程?

对具有空值和不同值的行进行分组

如何在sql developer中执行同时具有out参数和返回值的函数以获取结果