oracle regexp_replace 保留数字和反斜杠

Posted

技术标签:

【中文标题】oracle regexp_replace 保留数字和反斜杠【英文标题】:oracle regex_replace to keep digit and backslash 【发布时间】:2018-05-30 23:10:40 【问题描述】:

我的 excel 文件在日期字段中包含一些垃圾数据。

日期格式为 1/2/2015 格式。我正在尝试将该文件加载到 varchar 字段中的阶段表中,并在加载到主表之前应用正则表达式替换函数来清理坏数据

谁能给我合适的表达方式

create table A
(
bad_date varchar2(4000)
);

insert into A
( bad_date)
values ('1/2/2005');
insert into A
( bad_date)
values ('indep');
insert into A
( bad_date)
values ('/');

commit;


 create table B
    (
    good_date date
    );

我想使用正则表达式函数来清理不在日期模式中的数据。感谢您的帮助!

【问题讨论】:

【参考方案1】:

使用^[0-9]1,2/[0-9]1,2/[0-9]4 模式表示regexp_like 符合您的日期格式。

使用以下 insert 语句获取干净的日期数据:

insert into B
select * from
( select to_date(bad_date,
           case when 
             regexp_like(bad_date,'^[0-9]1,2/[0-9]1,2/[0-9]4') then 
             'DD/MM/YYYY'
           end) dateConverted          
    from A)
where dateConverted is not null;    

SQL Fiddle Demo

【讨论】:

【参考方案2】:

您可以通过以下方式接近:

select (case when regexp(bad_date, '^[0-1]?[0-9]/[0-3]?[0-9]/[0-9]4$')
             then to_date(bad_date, 'MM/DD/YYYY'
        end) as converted_date

【讨论】:

【参考方案3】:

使用以下内容:

INSERT INTO B (GOOD_DATE)
  SELECT TO_DATE(BAD_DATE, 'DD/MM/YYYY')
    FROM A
    WHERE REGEXP_LIKE(BAD_DATE, '[0-9]+/[0-9]+/[0-9]+')

SQLFiddle here

祝你好运。

【讨论】:

【参考方案4】:

我倾向于贡献一个更成熟的正则表达式来匹配m/d/yyyy格式的有效日期:

INSERT INTO B (GOOD_DATE)
  SELECT TO_DATE(BAD_DATE, 'DD/MM/YYYY')
    FROM A
    WHERE REGEXP_LIKE(BAD_DATE,
            '^(0?[1-9]|[12][0-9]|3[01])\/(0?[1-9]|1[012])\/(19|20)[0-9][0-9]$'
    )

SQLFiddle

灵感来自

Regex to validate dates in this format d/m/yyyy https://www.regular-expressions.info/dates.html

【讨论】:

以上是关于oracle regexp_replace 保留数字和反斜杠的主要内容,如果未能解决你的问题,请参考以下文章

Regexp_replace :从 Oracle 中的“+”分隔字符串中删除重复项 [重复]

将 Oracle Regexp_replace 函数转换为 Netezza

oracle 的 regexp_replace 替换 https 不起作用

试图了解oracle REGEXP_REPLACE如何工作

关于 Oracle Regexp_Replace

如何在 edb 中使用相同的 REGEXP_REPLACE(Oracle sql)