2015-07-10 46 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;