参数说明:

第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字段在该表的数据都是唯一的。

正确实现:

 1 SELECT T1.ID_CARD
 2   FROM VIRTUAL_CARD_TEST T1
 3  WHERE INSTR(T1.NAME, '*') > 0
 4 UNION
 5 SELECT T1.ID_CARD
 6   FROM VIRTUAL_CARD_TEST T1
 7  WHERE INSTR(T1.NAME, '#') > 0
 8 UNION
 9 SELECT T1.ID_CARD
10   FROM VIRTUAL_CARD_TEST T1
11  WHERE INSTR(T1.NAME, '/') > 0
12 UNION
13 SELECT T1.ID_CARD
14   FROM VIRTUAL_CARD_TEST T1
15  WHERE INSTR(T1.NAME, '+') > 0
16 UNION
17 SELECT T1.ID_CARD
18   FROM VIRTUAL_CARD_TEST T1
19  WHERE INSTR(T1.NAME, '!') > 0
20 UNION
21 SELECT T1.ID_CARD
22   FROM VIRTUAL_CARD_TEST T1
23  WHERE INSTR(T1.NAME, '.') > 0

分析:查询的时候至少要携带一个唯一字段(主键或id_card),为什么?

其一: 姓名肯定有重复的,但又不能使用关键字union进行去重,会导致数据缺失;

其二: 姓名可能包含好几个特殊字符,每判断一次,就会叠加一次,会多于实际数据。

方式二:使用like关键字实现。

4.排除脏数据查询

错误方式:

当脏数据都包含所有特殊字符时,可以使用该方法。

正确方式:

5.删除脏数据

见文末推荐

哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!

相关推荐:

  • oracle 批量删除表数据的2种方式
  • oracle 常用函数
  •