在使用Oracle或者其它數據庫時,使用like 關鍵字進行模糊查詢是大家經常使用的功能,在純中文環境中使用非常好用,還有一些通配符可以使用,但是在純英文環境中,會出現大小需要精確匹配的問題,主要原因還是字符串的問題
FL like '%{0}%' and
這裡like後是一個字符串,這樣必然會有大小敏感的問題。比如如下的大小混編的字段
方案1
使用Oracle系統函數對需要查詢的列字符串進行小寫轉換(大寫也行,變量相關部分都是大寫轉換),如下所示:
select * from logo where lower(bsname) like '%cz%'
當然這樣還是不夠的需要將代碼中變量也轉換成相應的小寫
String.Format(" select * from logo where lower(bsname) like '%{0}%'", tbfl.ToLower());
該方案的優點:
數據庫兼容性好,sql server和mysql都可以按相應的原理來實現
缺點:
sql和代碼中添加額外的函數代碼,看起來不是這麼干淨
方案2
使用Oracle 正則表達式語法,完成大小寫的模糊匹配 ,具體例子如下
String.Format(" regexp_like(BSNAME,'[:graph:]*{0}[:graph:]*' ,'i') and", tbbs);
看到這裡可能有人會覺得寫的太淺了,可能覺得“regexp_like”,“[:graph:]*”是什麼鬼?
其實以本人實用主義的觀點出發完全已經夠用了,達到實現like模糊查詢的大小寫匹配也就夠了。
查閱了相關資料,發現oracle的正則表達式竟然對應java的(和c#的命名有些區別),這裡
regexp_like是oracle正則匹配的函數
[:graph:]*是匹配任意字符串(0或者n個字符)
“i”參數是忽略字符串大小的意思
具體如果想了解oracle 正則表達式的使用,參考資料我會附上一些外鏈。這裡其實也是我想吐槽的地方,可能也是作為一個實用主義者的一些想法吧,當時我做這個需求的時候,baidu到基本是方案2,但是一些資料基本都是把oracle 正則表達式列出來解釋一遍,其實我要的就是一個正則模擬like的功能而已,我想如果作為一個不是精通正則的新手,學習一大堆也未必能用的上,所以我才有把這篇文章分享出來想法,如果有需求就拿去用好了,如果真需要正則,那再深入學習。
該方案的優點:
使用簡單,語句干淨,考慮的地方少
缺點:
數據庫不兼容(別的數據庫可能函數不同,需要查閱資料)
這篇文章很短,但是是我的原創,也是工作中的一些小的經驗,希望讀者您是通過搜索引擎找到它的,也希望它能對你的工作有所幫助,同時這也是我真正意義的第一篇原創博文,我也嘗試添加了打賞的功能,畢竟我還是屌絲,當然精神上的鼓勵也是一樣的,希望得到你們的鼓勵。btw,希望它是有用的!
文章提供具體的思路和實現方式,但由於沒有執行嚴格的代碼測試,不保證執行100%正確,如果有問題也可以反饋給本人或者留言和本人討論,共同提高,共同進步。
SQL Like 通配符
oracle正則表達式regexp_like的用法詳解