SQL學習之用通配符進行數據過濾


一、Like操作符

      之前介紹的所有的操作符都是針對已知值進行過濾。不管匹配一個值還是多個值,檢驗大於還是小於已知值,或者檢查某個范圍的值,其共同點是過濾中使用的值都是已知的。

但是這種方法並不是任何時候都好用。有如下代碼:

select ItemId,ItemName,CheckValueNum,CheckValueString,ResultLevel from T_Check_InfoDetail

需求:現在需要檢索ItemName中包含"心率"的行記錄,這個時候使用簡單的比較操作符肯定不行,必須使用通配符。利用通配符,可以 創建  比較 特定的數據 的搜索模式,在這里如果我們想找出ItemName包含"心率"的行記錄,可以構造一個通配符搜索模式:

通配符:用來匹配值的一部分的特殊字符。

搜索模式:由字面值、通配符或兩者組合構成的搜索條件。

而使用通配符搜索模式,必須使用LIKE操作符,LIKE指示DBMS(數據庫管理系統),后跟的搜索模式利用通配符匹配而不是簡單的相等匹配進行比較。

這里上面提出的檢索要求我們還沒有完成,在下面介紹完通配符后再完成上面的檢索任務。

 

二、通配符

1、百分號(%)通配符

這個通配符使我們日常開發中最常使用的通配符,在搜索串中,%表示任何字符出現任意次數(包括0次),現在我通過"%"通配符來完成上面提出的需求代碼如下:

select ItemId,ItemName,CheckValueNum,CheckValueString,ResultLevel from T_Check_InfoDetail where ItemName LIKE '心率%'

ok,完成了上面的需求。

這段代碼使用了搜索模式'心率%',在執行這條子句時,將檢索任意ItemName列值以'心率'開頭的詞。%告訴DBMS(數據庫管理系統)接收'心率'之后的任意字符,不管他有多少字符。

下面我們蓋面上面的需求,檢索ItemName列值中包含'范圍'的行數據,這個時候用上面'范圍%'的搜索模式就無法搜索出來,下面是解決代碼:

select ItemId,ItemName,CheckValueNum,CheckValueString,ResultLevel from T_Check_InfoDetail where ItemName LIKE '%范圍%'

搜索模式'%范圍%'表示匹配任何位置上包含文本'范圍'的值,不論他之前或之后出現什么字符。

這里表示搜索ItemName列值中包含'范圍'的行數據,不論它之前或者之后出現什么字符。

 

下面再次更改上面的需求,檢索ItemName列值中以'心'開頭,以'定'結尾的行數據。下面是解決代碼:

select ItemId,ItemName,CheckValueNum,CheckValueString,ResultLevel from T_Check_InfoDetail where ItemName LIKE '心%定'

這段代碼使用了搜索模式'心%定',在執行這條子句時,將檢索任意ItemName 列值以'心'開頭,已'定'結尾的行數據,%告訴DBMS(數據庫管理系統)接收'心'之后,'定'之前的任意字符,不管這中間有多少字符。

在使用'%'匹配的時候,需要注意的幾點:

1、%幾乎可以匹配任何東西,但有個例外,這就是null。

2、注意搜索模式'心%定 ',發現定后面有一個空格,而這個空格恰好改變了我們的檢索的初衷,這時候DBMS回去匹配以'定 '結尾的行數據,所以在使用通配符匹配數據的時候,一定要注意空格。

 

2、下划線( _ )通配符

下划線(_)通配符與百分號通配符的作用一樣,但他只匹配單個字符,而不是多個字符。如下代碼:

 

select * from dbo.course where tno='t003'

 

 

 

 

現在我們需要檢索cname列值中SERVER 2005前面帶一個空格再加上三個字符的行數據,下面是解決代碼:

select * from dbo.course where cname like '___ SERVER 2005'

ok,完成需求.這里一共三個下划線,剛好匹配了三個字符,一個不多一個不少,且這三個字符位於cname列值的開頭.如果前面還有字符,像  SQL SERVER 2005,前面還有一個空格,這樣的數據就無法匹配到!

注意:這里的空格問題,不能多也不能少!

 

3、方括號([])通配符

方括號( [] )用來指定一個字符集,他必須匹配指定位置(通配符的位置)的一個字符(也就是說必須指定通配符的位置,也就是需要檢索的字符的位置)。代碼如下:

select * from dbo.student

現在我們需要檢索出sname列值中以'張'或'王'開頭的學生,下面是解決代碼:

select * from dbo.student where sname like '[張王]%'
select * from dbo.student where sname like '%[張王]%'

這個搜索模式使用了兩個不同的通配符,[張王]匹配方括號中的任意一個字符,他也只能匹配單個字符,任何多於一個字符的名字(也就是說你想用[]通配符檢索sname列值為'李波'的是無法匹配的)都不匹配,%通配符匹配單個字符之后的任意數字的字符(包括0個)。

現在我們變下需求,我們需要檢索sname列值中除了姓張和姓王之外的所有學生的姓名,和上面的需求剛好相反,下面是解決代碼:

第一種方法:使用not操作符

select * from dbo.student where sname not like '[張王]%'

第二種方法:使用^前綴

select * from dbo.student where sname  like '[^張王]%'

結果都是一樣!

 

通配符雖然好用,但是我們使用這種功能也是有代價的!

(1)通配符搜索比其他的操作府搜索耗費的時間更長!

(2)在確實需要使用通配符時,盡量不要把他們用在搜索模式的開始,因為把他至於搜索模式的開始,搜索起來是很慢的!

(3)注意通配符的位置,如果放錯地方,可能不會返回想要的數據!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM