1.情景展示
如何将表中的包含特殊字符的脏数据查出来?
2.instr()函数
语法:
instr(string, substring[, start_position[, th_appearance]])
参数说明:
第1个参数表示:必选项。将要被检索的字符串,可以是CHAR,VARCHAR2,NCHAR,NVARCHAR2,CLOB或NCLOB等类型;
第2个参数表示:必选项。将要查找的字符串,可以是CHAR,VARCHAR2,NCHAR,NVARCHAR2,CLOB或NCLOB等类型;
第3个参数表示:可选项。从字符串第几(start_position)位开始搜索; 默认值为1;正数,从前往后查找;负数,从后往前查找;
第4个参数表示:可选项。要查找的字符串的第几(th_appearance)次出现; 默认值为1;
返回值:返回substring在string的位置;如果在字符串中找不到substring,将返回0。
说明:字符串中的第一个位置是1。
3.解决方案
方式一:使用instr()函数(推荐使用);
总数据
两个查询结果一致,由此可见:
该表不存在重复数据;
id_card字段在该表的数据都是唯一的。
正确实现:
SELECT T1.ID_CARD
FROM VIRTUAL_CARD_TEST T1
WHERE INSTR(T1.NAME, '*') > 0
UNION
SELECT T1.ID_CARD
FROM VIRTUAL_CARD_TEST T1
WHERE INSTR(T1.NAME, '#') > 0
UNION
SELECT T1.ID_CARD
FROM VIRTUAL_CARD_TEST T1
WHERE INSTR(T1.NAME, '/') > 0
UNION
SELECT T1.ID_CARD
FROM VIRTUAL_CARD_TEST T1
WHERE INSTR(T1.NAME, '+') > 0
UNION
SELECT T1.ID_CARD
FROM VIRTUAL_CARD_TEST T1
WHERE INSTR(T1.NAME, '!') > 0
UNION
SELECT T1.ID_CARD
FROM VIRTUAL_CARD_TEST T1
WHERE INSTR(T1.NAME, '.') > 0
分析:查询的时候至少要携带一个唯一字段(主键或id_card),为什么?
其一:姓名肯定有重复的,但又不能使用关键字union进行去重,会导致数据缺失;
其二:姓名可能包含好几个特殊字符,每判断一次,就会叠加一次,会多于实际数据。
方式二:使用like关键字实现。
4.排除脏数据查询
错误方式:
错在哪?
当脏数据都包含所有特殊字符时,可以使用该方法。
正确方式:
5.删除脏数据
见文末推荐