如何格式化只针对ORA-01843是不是抛出的记录?(How to format only thos

2019-10-29 06:14发布

我与下面的样本数据的列。 列的数据类型是VARCHAR2.

050211
042911
110428
110428
AO0102
JAN 31
FEB 01

当我尝试用下面的代码以可读格式来格式化列的记录,我得到

ORA-01843 : Not a valid month 

SELECT to_char(to_date(TRIM(MyColumn), 'YYMMDD'), 'MM/DD/YYYY') FROM MyTable;

我相信ORA-01843是因为记录AO0102,1月31日,2月1日抛出。

我怎么能忽略这些记录(以及可能只是显示其原始值)抛出ORA-01843和格式仅可在普通的SQL SELECT语句被格式化的记录?

Answer 1:

使用CASE表达,其检查柱的状态,并且仅有条件尝试分析为有效日期:

SELECT
    MyColumn,
    CASE WHEN REGEXP_LIKE(MyColumn, '^\s*\d\d\d\d\d\d\s*$')
         THEN TO_CHAR(TO_DATE(TRIM(MyColumn), 'YYMMDD'), 'MM/DD/YYYY')
         ELSE MyColumn END AS new_col
FROM MyTable

但作为一般性意见,你应该避免存储您的表作为文本的最新信息。 您现在看到的原因,以避免这一点。



文章来源: How to format only those records for which ORA-01843 is not thrown?