2015-07-10 134 views
0

在名为customers的表中,我有一个varchar2列(financial_month)。
这个列应该是一个日期列,但由于它是一个varchar2列,并且由于一些错误的编码,所以有很多数据不是日期格式。
例如:0.15已存储在一条记录和许多其他错误条目中。从oracle的varchar列中删除非日期值

现在我想消除所有错误的条目。
我应该遵循什么程序?
我没有任何线索。我也无法识别错误的条目。我唯一知道的是有超过1000个错误的条目。

如何删除此列中的所有错误条目?

+0

为什么你认为你需要一个存储过程? –

+0

我认为REGEXP_LIKE可能是一个选项。 – user2672165

+1

请参阅:http://stackoverflow.com/questions/14421534/how-to-convert-varchar-to-date-only-when-it-contains-a-valid-date和 https://docs.oracle.com .com/cd/B28359_01/olap.111/b28126/dml_functions_1106.htm#OLADM567 –

回答

0

您可以使用类似

WHERE REGEXP_LIKE(financial_month, '^[0-9]{2}[.][0-9]{2}[.][0-9]{4}$') 

找到与日期值的行
(这是日期格式DD.MM.YYYY或MM.DD.YYYY)

或更精确正则表达式

'^[0-3][0-9][.][0-1][0-9][.](19|20)[0-9]{2}$' 

为DD.MM.YYYY格式。

0

假设“金融个月”的格式必须为MM/YYYY:

CREATE TABLE fm_t (fm VARCHAR2(30)); 

INSERT INTO fm_t VALUES ('01/2015'); 
INSERT INTO fm_t VALUES ('0.5'); 
INSERT INTO fm_t VALUES ('whatsever'); 
INSERT INTO fm_t VALUES ('02/2015'); 
SELECT * FROM fm_t; 

CREATE OR REPLACE FUNCTION fm_f(fm IN VARCHAR2) RETURN INTEGER IS 
    d DATE; 
BEGIN 
    d := TO_DATE(fm, 'FMMM/YYYY'); 
    RETURN 1; 
    EXCEPTION WHEN OTHERS THEN 
     RETURN 0; 
END; 
/

DELETE fm_t WHERE fm_f(fm) <> 1; 
SELECT * FROM fm_t; 

DROP FUNCTION fm_f; 
DROP TABLE fm_t;