在名爲customers的表中,我有一個varchar2列(financial_month)。
這個列應該是一個日期列,但由於它是一個varchar2列,並且由於一些錯誤的編碼,所以有很多數據不是日期格式。
例如:0.15已存儲在一條記錄和許多其他錯誤條目中。從oracle的varchar列中刪除非日期值
現在我想消除所有錯誤的條目。
我應該遵循什麼程序?
我沒有任何線索。我也無法識別錯誤的條目。我唯一知道的是有超過1000個錯誤的條目。
如何刪除此列中的所有錯誤條目?
在名爲customers的表中,我有一個varchar2列(financial_month)。
這個列應該是一個日期列,但由於它是一個varchar2列,並且由於一些錯誤的編碼,所以有很多數據不是日期格式。
例如:0.15已存儲在一條記錄和許多其他錯誤條目中。從oracle的varchar列中刪除非日期值
現在我想消除所有錯誤的條目。
我應該遵循什麼程序?
我沒有任何線索。我也無法識別錯誤的條目。我唯一知道的是有超過1000個錯誤的條目。
如何刪除此列中的所有錯誤條目?
您可以使用類似
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格式。
假設「金融個月」的格式必須爲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;
爲什麼你認爲你需要一個存儲過程? –
我認爲REGEXP_LIKE可能是一個選項。 – user2672165
請參閱: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 –