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字段在該表的數據都是唯一的。
正確實現:
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.刪除臟數據
見文末推薦
