投稿:mrr 字體:[增加 減小] 類型:轉載 時間:2017-07-23 我要評論
說到SQL的模糊查詢,最先想到的,應該就是like關鍵字。當我們需要查詢包含某個特定字段的數據時,往往會使用 ‘%關鍵字%’ 查詢的方式。具體代碼示例大家參考下本文前言
說到SQL的模糊查詢,最先想到的,應該就是like關鍵字。
當我們需要查詢包含某個特定字段的數據時,往往會使用 ‘%關鍵字%' 查詢的方式。例如:
SELECT ... FROM 表名 WHERE 字段名 LIKE '%關鍵字%'
這應該可以算是一種典型的”包含XXX”的方式,但如果我們需要查詢字段被包含於特定字符的數據時呢?
比如,我有一張聯系人數據表ConnectName,其中有個字段用於記錄姓名name。我想獲取名為小蘭和灰原的人的聯系資料。正常情況下,我們首先能想到的做法應該是:
SELECT * FROM ConnectName WHERE name = '小蘭' OR name = '灰原'
這樣的做法是可以實現這種目的的。如果這時候,我突然想,再查一個人,比如說“柯南”,那麼我們就要修改SQL的結構,添加一個Where條件句:
SELECT * FROM ConnectName WHERE name = '小蘭' OR name = '灰原' OR name = '柯南'
我們知道,OR條件查詢本身是屬於效率較低的,而且結構變動的語句在MyBatis實現稍微麻煩些(當然也是可以實現的,遍歷插入字段就行了)。
能不能簡單一些呢?我可以把所有關鍵字放在一起,只用一個Where條件去實現嗎?
CHARINDEX登場
這時候,我們就可以用 CHARINDEX 關鍵字了,CHARINDEX可以返回某個字段在一串文字中出現的位置,跟String的indexOf用法類似,不多廢話,我們來舉個栗子:
CHARINDEX('李白','曹操很帥') =0
在上面的栗子中,因為曹操很帥不包含李白關鍵字,所以找不到,返回0.
CHARINDEX('李白','李白很帥') =1
同樣的栗子,因為包含裡李白關鍵字,會返回關鍵字所在的開頭第一個字的索引,所以返回1.
了解了使用方法之後,我們就可以運用CHARINDEX關鍵字優化下我們的SQL語句:
SELECT * FROM ConnectName WHERE CHARINDEX(name ,'小蘭灰原柯南')>0
如果name字段對應的名字在 ‘小蘭灰原柯南' 中出現,那麼CHARINDEX函數就會返回大於1,就可以得到我們想要的數據啦(他們3個人也可以在一起愉快的玩耍咯^-^)
對應的mybatis實現也相對簡潔
SELECT * FROM ConnectName WHERE <!--[CDATA[ AND CHARINDEX(name ,#{傳入的參數}) --> 0 ]]>
如果後期我們想要加入一個新的人,比如毛利小五郎,只需要在傳入的參數中加入 ‘小蘭灰原柯南毛利小五郎' 就可以了,是不是簡單了許多呢?
以上所述是小編給大家介紹的SQL字段的被包含查詢語句,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會及時回復大家的!