轉換資料
SQL
Sever足夠強大,可以在需要的時候把大部分數值從一種類型轉換為另一種類型。例如,要比較SMALLINT型和INT型資料的大小,你不需要進行明確的型別轉換。 SQL
Sever會為你完成這項工作。但是,當你想在字符型資料和其它類型的資料之間進行轉換時,你的確需要自己進行轉換操作。例如,假設你想要從一個MONEY型欄位中取出所有的值,並在結果後面加上字串「US
Dollars」。你需要使用函數CONVERT(),如下例所示:
SELECT CONVERT(CHAR(8),PRice)+’US Dollars’ FROM
orders
函數CONVERT()帶有兩個變數。第一個變數指定了資料類型和長度。第二個變數指定了要轉換的欄位。在這個範例中,字段price被轉換成長度為8個字元的CHAR型欄位。字段price要轉換成字元型,才可以在它後面連接上字串’US
Dollars’。
當向BIT型,DATETIME型,INT型,或NUMERIC型欄位加入字串時,你需要進行同樣的轉換操作。例如,下面的語句在一個SELECT語句的查詢結果中加入字串’The
vote is’,該SELECT語句傳回一個BIT型欄位的值:
SELECT ‘The vote
is’+CONVERT(CHAR(1),vote) FROM opinion
下面是這個語句的結果範例:
The vote is
1
The vote is 1
The vote is 0
(3 row(s)
affected)
如果你不進行顯式的轉換,你會收到如下的錯誤訊息:
Implicit conversion from
datatype ‘varchar’ to ‘bit’ is not allowec.
Use the CONVERT function to
run this query.
操作字串資料
SQL
Sever有許多函數和表達式,使你能對字串進行有趣的操作,包括各種各樣的模式匹配和字元轉換。在這一節中,你將學習如何使用最重要的字元函數和表達式。
符合通配符
假設你想要建立一個與Yahoo功能相似的Internet目錄。你可以建立一個表用來保存一系列的網站名稱,統一資源定位器(URL),描述,和類別,並允許訪問者通過在HTML
form中輸入關鍵字來檢索這些內容。
假如有一個訪客想從這個目錄中得到其描述中包含關鍵字trading
card的站點的清單。要取出正確的站點列表,你也許試圖使用這樣的查詢:
SELECT site_name FROM site_directory
WHERE site_desc=’trading card’
這個查詢可以運作。但是,它只能傳回那些其描述中只有trading
card這個字串的網站。例如,一個描述為We have the greatest collection of trading cards in the
world!的網站不會被回傳。
要把一個字串與另一個字串的一部分相匹配,你需要使用通配符。你使用通配符和關鍵字LIKE來實現模式匹配。下面的語句使用通配符和關鍵字LIKE重寫了上面的查詢,以傳回所有正確網站的名稱:
SELECT
SITE_name FROM site_directory
WHERE site_desc LIKE ‘%trading
cark%’
在這個例子中,所有其描述中包含表達式trading card的站點都被傳回。描述為We have the greatest
collection of trading cards in the world!的網站也被回傳。當然,如果一個站點的描述中包含I am trading
cardboard boxes online
,該站點的名字也被返回。
注意本例中百分號的使用。百分號是通配符的例子之一。它代表0個或多個字元。透過把trading
card括在百分號中,所有其中嵌有字串trading
card的字串都被匹配。
現在,假設你的網站目錄變得太大而不能在一頁中完全顯示。你決定把目錄分成兩個部分。在第一頁,你要顯示所有首字母在A到M之間的網站。在第二頁,你要顯示所有首字母在N到Z之間的網站。要得到第一頁的網站列表,你可以使用以下的SQL語句:
SELECT
site_name FROM site_directory WHERE site_name LIKE
‘[A-M]%’
在這個例子中使用了表達式[A-M],只取出那些首字母在A到M之間的站點。中括號([])用來匹配處在指定範圍內的單一字元。要得到第二頁中顯示的站點,應使用這個語句:
SELECT
site_name FROM site_directory
WHERE site_name LIKE
‘[N-Z]%’
在這個例子中,括號中的表達式代表任何處在N到Z之間的單一字元。
假設你的網站目錄變得更大了,你現在需要把目錄分成更多頁。如果你想顯示那些以A,B或C開頭的站點,你可以用下面的查詢來實現:
SELECT
site_name FROM site_directory WHERE site_name LIKE
‘[ABC]%’
在這個例子中,括號中的表達式不再指定一個範圍,而是給了一些字元。任何一個其名字以這些字元中的任一個開頭的站點都將被傳回。
透過在括號內的表達式中同時包含一個範圍和一些指定的字符,你可以把這兩種方法結合起來。例如,用下面的這個查詢,你可以取出那些首字母在C到F之間,或者以字母Y開頭的站點:
SELECT
site_name FROM site_directory WHERE site_name LIKE
‘[C-FY]%’
在這個例子中,名字為Collegescape和Yahoo的站點會被選取,而名字為Magicw3的站點則不會被選取。
你也可以使用脫字符(^)來排除特定的字符。例如,要得到那些名字不以Y開頭的站點,你可以使用如下的查詢:
SELECT
site_name FROM site_directory WHERE site_name LIKE
‘[^Y]%’
對給定的字元或字元範圍均可使用脫字符。
最後,透過使用下劃線字元(_),你可以匹配任何單一字元。例如,下面這個查詢傳回每一個其名字的第二個字元為任何字母的網站:
SELECT
site_name FROM site_directory WHERE site_name LIKE
‘M_crosoft’
這個範例既回傳名為Microsoft的站點,也回傳名為Macrosoft的站點。但是,名字為Moocrosoft的網站則不會被回傳。與通配符’%’不同,底線只代表單一字元。
注意:
如果你想匹配百分號或下劃線字元本身,你需要把它們括在方括號中。如果你想要匹配連字號(-),應把它指定為方括號中的第一個字元。如果你想匹配方括號,應把它們也括在方括號中。例如,下面的語句傳回所有其描述中包含百分號的網站:
SELECT
site_name FROM site_directory WHERE site_desc LIKE
‘%[%]%’
匹配發音
Microsoft SQL
有兩個允許你按照發音來匹配字串的函數。函數SOUNDEX()給一個字串分配一個音標碼,函數DIFFERENCE()按照發音比較兩個字串。當你不知道一個名字的確切拼寫,但多少知道一點它的發音時,使用這兩個函數將有助於你取出該記錄。
例如,如果你建立一個Internet目錄,你也許想增加一個選項,允許訪問者按照站點名的發音來搜索站點,而不是按名字的拼寫。考慮如下的語句:
SELECT
site_name FROM site_directory
WHERE DIFFERENCE(site_name ,
‘Microsoft’>3
這個語句使用函數DEFFERENCE()來取得其名字的發音與Microsoft非常相似的網站。函數DIFFERENCE()傳回一個0到4之間的數字。如果函數回傳4,表示發音非常相近;如果函數回傳0,表示這兩個字串的發音相差很大。
例如,上面的語句會傳回網站名稱Microsoft和Macrosoft。這兩個名字的發音與Microsoft都很相似。如果你把上一語句中的大於3改為大於2,那麼名為Zicrosoft和Megasoft的網站也會被回傳。最後,如果你只需要差別等級大於1即可,則名為Picosoft和Minisoft的網站也會被比對。
要深入了解函數DIFFERENCE()是如何運作的,你可以用函數SOUNDEX()來傳回函數DIFFERENCE()所使用的音標碼。這裡有一個例子:
SELECT
site_name ‘site name’,SOUNDEX(site_name) ‘sounds
like’
這個語句選取字段site_name的所有資料及其音標碼。以下是這個查詢的結果:
site name sounds
like
……………………………………………………………….
Yahoo Y000
Mahoo
M000
Microsoft M262
Macrosoft M262
Minisoft
M521
Microshoft M262
Zicrosoft Z262
Zaposoft
Z121
Millisoft M421
Nanosoft N521
Megasoft
M221
Picosoft P221
(12 row(s)
affected)
如果你仔細看一下音標碼,你會注意到音標碼的第一個字母與字段值的第一個字母相同。例如,Yahoo和Mahoo的音標碼只有第一個字母不同。你也可以發現Microsoft和Macrosoft的音標碼完全相同。
函數DIFFERENDE()比較兩個字串的第一個字母和所有的子音字母。此函數忽略任何元音字母(包括y),除非一個元音字母是一個字串的第一個字母。
不幸的是,使用SOUNDEX()和DIFFERENCE()有一個欠缺。 WHERE子句中包含這兩個函數的查詢執行起來效果不好。因此,你應該小心使用這兩個函數。
刪除空格
有兩個函數,TTRIM()和LTRIM(),可以用來從字串中剪掉空格。函數LTRIM()移除應該字串前面的所有空格;函數RTRIM()去除一個字串尾部的所有空格。這裡有一個任何使用函數RTRIM()的範例:
SELECT
RTRIM(site_name) FROM
site_directory
在這個例子中,如果任何一個站點的名字尾部有多餘的空格,多餘的空格將從查詢結果中刪除。
你可以巢狀使用這兩個函數,把一個字串前後的空格同時刪除:
SELECT
LTRIM(RTRIM(site_name) FROM
site_directory
你會發現,在從CHAR型欄位中剪掉多餘的空格時,這兩個函數非常有用。記住,如果你把字串儲存在CHAR型欄位中,該字串會被追加多餘的空格,以符合該欄位的長度。用這兩個函數,你可以去掉無用的空格,從而解決這個問題。
以上就是SQL資料操作基礎(中級)9的內容,更多相關文章請關注PHP中文網(www.php.cn)!