LIKE模糊查詢

任何一個後端開發人員都寫過模糊查詢的方法(當然包括猿Why)……
後端會有這樣幾個過程:
從前端接收查詢條件參數,例如:conditionA,conditionB

selectByLike(String conditionA,String conditionB);

通過持久層、SQL預編譯等步驟,就會有這樣的SQL語句:

SELECT   d.fieldA, d.fieldB, d.fieldC FROM DEMOTABLE d where d.fieldA LIKE ? AND  d.fieldB LIKE ?

那麼,關於參數的處理,一般都是在後端代碼中處理的,比如

// 左右均模糊
String.formatter("%%%s%%",conditionA);
// 只模糊右邊(數據庫表中某一列,如果需要添加索引,特別不建議在左邊也進行模糊)
String.formatter("%s%%",conditionB);

最後方法調用的效果幾乎是這樣的

selectByLike(String.formatter("%%%s%%",conditionA),String.formatter("%s%%",conditionB));

以上呢就是常規操作,但是有一小缺陷:
如果我conditionA的值爲"some_thing",那麼最後的查詢結果會匹配到some[此處可以是任意一個字符]thing,
當然,’%’、’'這些自字符可能也會引起開發人員的不適。
我的解決辦法呢?

conditionA.replaceAll("_","/_").replaceAll("%","/%");

並且在SQL語句LIKE字段append escape ‘/’,(關於escape的介紹)SQL預編譯出來的效果:

SELECT   d.fieldA, d.fieldB, d.fieldC FROM DEMOTABLE d where d.fieldA LIKE ? escape '/' AND  d.fieldB LIKE ? escape '/'

需要補充一下:escape 作用範圍,僅僅是在一個like條件之後的,並不是整個where之後出現的like都作用。

遇到這種情況,猿Why可以想到這樣的辦法來解決,如果guru有更好的解決方案,請賜教!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章