oracle 当NO_RECORD_FOUND或NULL在列ELSE中找到值时返回TO_DATE的PL/SQL语句

n53p2ov0  于 2023-05-16  发布在  Oracle
关注(0)|答案(3)|浏览(143)

我在工资单文档中有一个案例,如果没有终止日期,则员工的终止日期可能为(空)。有时,我得到的不仅仅是约会(垃圾)。有时候我会有一份真实的终止日期报告。
在这种情况下,我不希望在尝试确定是否找到记录时使用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;
dauxcl2d

dauxcl2d1#

如果您使用的是PL/SQL,则可以从Oracle 12用途:

DECLARE
  v_b output_table.b%TYPE;
BEGIN
  SELECT b
  INTO   v_b
  FROM   OUTPUT_TABLE
  WHERE  A = 'Term Date:'
  AND    VALIDATE_CONVERSION(B AS DATE, 'mm-dd-yyyy') = 1;

  DBMS_OUTPUT.PUT_LINE(v_b);
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    DBMS_OUTPUT.PUT_LINE('Does not exist or is not a valid date.');
END;
/

如果你只需要几行SQL:

SELECT ( SELECT TO_DATE(b DEFAULT NULL ON CONVERSION ERROR, 'mm-dd-yyyy')
         FROM   output_table
         WHERE  a = 'Term Date:' ) AS b
FROM   DUAL;
js81xvg6

js81xvg62#

对于那些11g或更老版本的用户,在这些更新的增强功能沿着之前,传统的方法是编写一个函数来捕获转换错误并返回NULL,而不是引发异常:

CREATE OR REPLACE FUNCTION f_safe_to_date(in_date_string IN varchar2, in_format IN varchar2)
  RETURN date
AS
  var_date date;
BEGIN
  var_date := TO_DATE(in_date_string,in_format);
  RETURN var_date;
EXCEPTION
  WHEN OTHERS THEN
    RETURN NULL;
END;

然后在select语句中使用它:

SELECT f_safe_to_date(B, 'mm-dd-yyyy') term_date FROM OUTPUT_TABLE WHERE A = 'Term Date:'

当然,如果您想减少不必要的执行,可以添加更多的REGEXP_LIKE逻辑,但结果是一样的。

bq3bfh9z

bq3bfh9z3#

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;

今天,我学会了:

  1. Oracle中有一个名为DUAL的“Dummy Table”,当没有找到记录时,它将返回(null)。但将返回找到记录时所查找的实际值。
    1.有一个COALESCE可以用来测试NULL。[IS_NULL更容易记住,但显然ORACLE想要COALESCE代替]。我也玩过这个,但已经删除了上面的声明。
    1.有一个REGEX_LIKE,我可以用它来测试有效值,使用正则表达式。
    1.我可以把所有这些加到另一个函数中,比如TO_DATE()。
    1.还有一个DECODE函数,我尝试过,但决定不使用。我非常兴奋地得知,这可以作为一个三进制(如果当其他)选择器太。
    我希望有人觉得这很有用,如果我犯了一个错误,或者可能会有改进,请随时插话。

相关问题