Oracle中的like查詢注意下劃線“_”的使用
阿新 • • 發佈:2019-02-09
【前言】
今天突然測試出之前寫的SQL語句有一個漏洞,比如模糊匹配SQL是醬嬸兒的——name like 'ab_%',竟然能查詢出來值為abc_2016、abcd_2016的值來,好尷尬啊.........仔細的搜尋了一番,原來問題全出現在下劃線“_”身上,看來.............................................................自己還是太小白.....
言歸正傳:
【問題原因】
下劃線“_”在oracle中不是單純的表示下劃線的意思,而是表示匹配單一任何字元!
【解決辦法】
1.使用 escape() 函式
escape關鍵字經常用於使某些特殊字元,如萬用字元:'%','_'轉義為它們原來的字元的意義,被定義的轉義字元通常使用'\',但是也可以使用其他的符號。
例如:我上面的問題可以寫成where name like 'ab\_%' escape '\',這個“\”可以改為其他字元
【其他參考方法】
2.使用 instr() 函式輔助判斷
instr函式在Oracle/PLSQL中表示返回要擷取的字串在源字串中的位置;如果找到了,則返回下標(從1開始);如果沒有找到,則返回0。
3.使用 ASCII() 函式
ASCII函式表示返回最左邊的字元的字串str的數值。如果str是空字串,返回0。如果str為NULL, 返回NULL。
ASCII()是從0到255的數值的字元。