我在工资单文档中有一个案例,如果没有终止日期,则员工的终止日期可能为(空)。有时,我得到的不仅仅是约会(垃圾)。有时候我会有一份真实的终止日期报告。
在这种情况下,我不希望在尝试确定是否找到记录时使用IF、SELECT、CASE或EXECEPTION编写长行代码,也不希望确定日期是否是垃圾。我只想要一个NULL或一个TO_DATE。
我可能在这上面花了比它值得的更多的时间,但我想我会分享我的发现,看看大家的想法。我喜欢建设性的批评或改进。
然而,我想在Date为NOT NULL时在它周围添加“括号”,以便我可以在我正在编写的动态SQL中使用它。也就是说,它将是“15-Feb-2012”或只是NULL。
我正在玩解码器,现在让它发生,但仍在弄清楚。想法?
SELECT TO_DATE(
( SELECT B FROM OUTPUT_TABLE WHERE A = 'Term Date:' AND REGEXP_LIKE(B,'?[0-9]/?[0-9]/[0-9]{4}') )
, 'mm-dd-yyyy')
AS id FROM DUAL;
3条答案
按热度按时间dauxcl2d1#
如果您使用的是PL/SQL,则可以从Oracle 12用途:
如果你只需要几行SQL:
js81xvg62#
对于那些11g或更老版本的用户,在这些更新的增强功能沿着之前,传统的方法是编写一个函数来捕获转换错误并返回
NULL
,而不是引发异常:然后在select语句中使用它:
当然,如果您想减少不必要的执行,可以添加更多的
REGEXP_LIKE
逻辑,但结果是一样的。bq3bfh9z3#
今天,我学会了:
1.有一个COALESCE可以用来测试NULL。[IS_NULL更容易记住,但显然ORACLE想要COALESCE代替]。我也玩过这个,但已经删除了上面的声明。
1.有一个REGEX_LIKE,我可以用它来测试有效值,使用正则表达式。
1.我可以把所有这些加到另一个函数中,比如TO_DATE()。
1.还有一个DECODE函数,我尝试过,但决定不使用。我非常兴奋地得知,这可以作为一个三进制(如果当其他)选择器太。
我希望有人觉得这很有用,如果我犯了一个错误,或者可能会有改进,请随时插话。