SQL模糊查詢語法LIKE


執行 數據庫查詢時,有完整查詢和模糊查詢之分。
一般模糊語句如下:

SELECT 字段 FROM 表 WHERE 某字段 Like 條件

其中關於條件,SQL提供了四種匹配模式:

1,%:表示任意0個或多個字符。可匹配任意類型和長度的字符,有些情況下若是中文,請運用兩個百分號(%%)表示。

比如 SELECT * FROM [user] WHERE u_name LIKE '%三%'

將會把u_name爲“張三”,“張貓三”、“三腳貓”,“唐三藏”等等有“三”的記錄全找出來。

另外,如果須要找出u_name中既有“三”又有“貓”的記錄,請運用 and條件
SELECT * FROM [user] WHERE u_name LIKE '%三%' AND u_name LIKE '%貓%'

若運用 SELECT * FROM [user] WHERE u_name LIKE '%三%貓%'
雖然能搜索出“三腳貓”,但不能搜索出符合條件的“張貓三”。

2,_: 表示任意單個字符。匹配單個任意字符,它常用來限定表達式的字符長度語句:

比如 SELECT * FROM [user] WHERE u_name LIKE '_三_'
只找出“唐三藏”這樣u_name爲三個字且中間一個字是“三”的;

再比如 SELECT * FROM [user] WHERE u_name LIKE '三__';
只找出“三腳貓”這樣name爲三個字且第一個字是“三”的;


3,[ ]:表示括號內所列字符中的一個(類似正則表達式)。指定一個字符、字符串或範圍,要求所匹配對象爲它們中的任一個。

比如 SELECT * FROM [user] WHERE u_name LIKE '[張李王]三'
將找出“張三”、“李三”、“王三”(而不是“張李王三”);

如 [ ] 內有一系列字符(01234、abcde之類的)則可略寫爲“0-4”、“a-e”
SELECT * FROM [user] WHERE u_name LIKE '老[1-9]'
將找出“老1”、“老2”、……、“老9”;

4,[^ ] :表示不在括號所列之內的單個字符。其取值和 [] 相同,但它要求所匹配對象爲指定字符以外的任一個字符。

比如 SELECT * FROM [user] WHERE u_name LIKE '[^張李王]三'
將找出不姓“張”、“李”、“王”的“趙三”、“孫三”等;

SELECT * FROM [user] WHERE u_name LIKE '老[^1-4]';
將排除“老1”到“老4”,尋找“老5”、“老6”、……

5,查詢內容包含通配符時

由於通配符的緣故,導致我們查詢特殊字符“%”、“_”、“[”的語句不能正常實現,而把特殊字符用“[ ]”括起便可正常查詢。據此我們寫出以下函數:


function sqlencode(str)
str=replace(str,"[","[[]") '此句一定要在最前

str=replace(str,"_","[_]")
str=replace(str,"%","[%]")
sqlencode=str
end function

在查詢前將待查字符串先經該函數處理即可。
通常寫一個簡單的模糊查詢的SQL語句格式可以如下例:

sql="select * from 表名 where 字段名 like ’%" & request.form("請求變量") & "%’ "
說明:1、WHERE 關鍵詞的後面跟着用來過濾數據的條件,百分號%是通配符,可以代表多個任何字符,若是下劃線_就代表一個任意字符。
實例如下:

sql="select * from 表名 where 姓名 like ’%"&request.form("name")&"%’ and 性別 like ’%"&request.form("sex")&"%’ and 電話 like 
’%"&request.form("call")&"%’ "
上面這條SQL語句使用了三個模糊查詢條件:姓名、性別、電話,當然我們還可以用類似

姓名 like ’%"&request.form("name")&"%’ 的方式構造更多的條件。這樣我們就實現了多條件的模糊查詢,實際試一試,問題出來了!!!如果數據庫的查詢字段都有值的化沒問題,但如果是下邊這樣:

         姓名                                   性別           電話
         www.DeepTeach.com                    87654321
        當你模糊查詢:"電話:5432"時將無法輸出該記錄,這是因爲"性別"無值所以經兩個and運算後結果爲false/0,沒有輸出。 顯然數據庫中這三個字段的必須含有字段值,否則會漏掉正確的輸出結果,
        數據庫中正確的輸入應是這樣的:

         姓名                                    性別            電話
         www.DeepTeach.com       null       87654321        <null>值的邏輯值爲1,所以經兩次and運算後結果爲true/1,可以輸出上述記錄。

那麼在實際中如何來實現這樣的多條件模糊查詢呢?我是這樣來實現的:



name=Request.QueryString("name")     ’姓名
sex=Request.QueryString("sex")         ’性別
call=Request.QueryString("call")     ’電話

Sql= "Select * from 表名 where 1=1"    ’1=1 避免所有查詢字段爲空時出錯

if name <>"" then
  Sql= Sql & "and 姓名 like ’%"& name &"%’"
end if
if sex <>"" then
  Sql= Sql & "and 性別 = ’"& sex &"’"    ’這個不是模糊查詢了
end if
if call <>"" then
  Sql= Sql & "and 電話 like ’%"& call &"%’"
end if
......
      在此,你要注意到姓名、性別、電話這三個字段在數據庫中的類型應爲“文本”類型,否則查詢時會出現“數據類型不匹配”錯誤。
      如果三個條件均無輸入,點擊“查詢”時將顯示數據庫中的所有記錄,可能這是你不希望的,可以應該加入一個判斷:當三個條件均無輸入時,顯示“請輸入查詢條件”,並中斷輸出到客戶瀏覽器(response.end)例句如下:


if request.form("name")="" and request.form("sex")="" and request.form("call")="" then
    response.write("請輸入查詢條件(可模糊查詢)")
    response.end 
end if
      切記:sql="select * from 表名 where 姓名 ... 電話 like ... "
         必須在一行內輸入完,而不能用回車符分段,因爲vbs多行被認爲是多個語句,這是許多初寫者常犯的錯誤。如果你想分多段寫,可以用上面的方法在現有變量基礎上逐步增加查詢語句的各個組成部分並把它存在同一變量內實現。在封閉引號之前或者在打開引號之後你需要增加空格,這樣才能保證字符串連接起來的時候你沒有把幾個詞湊到了一塊。

 

 

逗號,在sql中like中不需要轉義,但是如果
在sql中的某個字段值用“,”分隔數據,
需要獲取數據的時候直接把“,”拆分成數據,獲得一個數據的list。

例如:需要查詢某字段是否包含一個值,
111是否存在於1111,2111,1112,1121,1113這個字段中 。
因爲根據“,”逗號分開,要求的答案是:不在字段中。

用傳統的like '%111%',顯然不合適,這樣雖然111不存在但是依然能查到該條記錄。
所以應該用以下語句實現:
select * from Table where ','+columA+',' like '%,111,%'。
實際就是把字段填上一個逗號然後在比較。如果你的字段是用別的分隔符,同理可得。

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