在名为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 –