如何在 oracle 中使用空值检查 last_modified 日期

Posted

技术标签:

【中文标题】如何在 oracle 中使用空值检查 last_modified 日期【英文标题】:how to check the last_modified date with null values in oracle 【发布时间】:2014-09-19 09:31:18 【问题描述】:

我有一个名为 orders 的表,其中每三个小时通过 CSV 文件将数据加载到加载器表中。我有一列 last_modified 设置为SYSDATE,它记录了表上的插入和更新。最近,我观察到 last_modified 列在更新发生时有超过 100k 条记录的空值。有没有办法解决这个问题?

Merge into orders d
  using (select * from ods_prm_data ) s
    on (d.order_id = s.order_id)
  when not matched then
    insert (d.order_id ,d.ID, d.last_modified)
    values (s.order_id, s.ID,s.order_seq.val,SYSDATE)
  when matched then
    update set d.last_modified = SYSDATE;

【问题讨论】:

CREATE TRIGGER ... BEFORE INSERT ? 话虽如此,这不是您描述的正常行为。也许要问的正确问题是“我的导入程序有什么问题?” 这是一个简单的合并语句,其中 last_update 正在开启和关闭.. 此表上没有启用触发器.. last_updated 日期具有一些记录的值,并且一些记录由于以下原因而无法更新我无法区分何时插入或更新记录.. 我可以看到这个触发器可以用于将来的目的,但是对于旧的记录集..我如何检查它们何时在目标表上插入或更新? 请注意:不要将澄清信息放入 cmets。编辑问题(您始终可以编辑自己的问题)并在问题本身中包含澄清信息。谢谢。 【参考方案1】:

查看 MERGE 语句的 WHEN NOT MATCHED 分支。我很惊讶这条语句甚至被编译了,因为 INSERT 字段列表 (d.order_id ,d.ID, d.last_modified) 指定了三个字段,但 VALUES 列表 (s.order_id, s.ID,s.order_seq.val, SYSDATE) 显示了四个值。我不确定它是如何通过编译器的,我也不知道它是如何被执行的;但是,它可能有助于解释您遇到的问题。

祝你好运。

【讨论】:

以上是关于如何在 oracle 中使用空值检查 last_modified 日期的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Oracle 中生成 xml 空值?

如何写sql语句去掉oracle返回结果中的空值(NULL)

oracle数据库中如何使得插入的空值显示为空白

如何在颤振发布方法中修复“未处理的异常:用于空值的空检查运算符”

oracle 学习笔记2

如何检查 var 的空值?