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 中参数中具有空值的结果的主要内容,如果未能解决你的问题,请参考以下文章