談談SQL查詢欄位被包含語句問題

巴扎黑
發布: 2017-08-11 15:08:22
原創
1543 人瀏覽過

說到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查詢欄位被包含語句問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!