一、利用SQL自帶函數(shù)
SQL
Sever足夠強(qiáng)大,可以在需要的時(shí)候把大部分?jǐn)?shù)值從一種類型轉(zhuǎn)換為另一種類型。例如,要比較SMALLINT型和INT型數(shù)據(jù)的大小,你不需要進(jìn)行顯式
的類型轉(zhuǎn)換。SQL
Sever會(huì)為你完成這項(xiàng)工作。但是,當(dāng)你想在字符型數(shù)據(jù)和其它類型的數(shù)據(jù)之間進(jìn)行轉(zhuǎn)換時(shí),你的確需要自己進(jìn)行轉(zhuǎn)換操作。例如,假設(shè)你想從一個(gè)MONEY
型字段中取出所有的值,并在結(jié)果后面加上字符串“US Dollars”。你需要使用函數(shù)CONVERT(),如下例所示:
SELECT CONVERT(CHAR(8),price)+’US Dollars’ FROM orders
函數(shù)CONVERT()帶有兩個(gè)變量。第一個(gè)變量指定了數(shù)據(jù)類型和長(zhǎng)度。第二個(gè)變量指定了要進(jìn)行轉(zhuǎn)換的字段。在這個(gè)例子中,字段price被轉(zhuǎn)換成長(zhǎng)度為8個(gè)字符的CHAR型字段。字段price要被轉(zhuǎn)換成字符型,才可以在它后面連接上字符串’US Dollars’。
當(dāng)向BIT型,DATETIME型,INT型,或者NUMERIC型字段添加字符串時(shí),你需要進(jìn)行同樣的轉(zhuǎn)換操作。例如,下面的語(yǔ)句在一個(gè)SELECT語(yǔ)句的查詢結(jié)果中加入字符串’The vote is’,該SELECT語(yǔ)句返回一個(gè)BIT型字段的值:
SELECT ‘The vote is’+CONVERT(CHAR(1),vote) FROM opinion
下面是這個(gè)語(yǔ)句的結(jié)果示例:
The vote is 1
The vote is 1
The vote is 0
(3 row(s) affected)
如果你不進(jìn)行顯式的轉(zhuǎn)換,你會(huì)收到如下的錯(cuò)誤信息:
Implicit conversion from datatype ‘varchar’ to ‘bit’ is not allowec.
Use the CONVERT function to run this query.
操作字符串?dāng)?shù)據(jù)
SQL Sever有許多函數(shù)和表達(dá)式,使你能對(duì)字符串進(jìn)行有趣的操作,包括各種各樣的模式匹配和字符轉(zhuǎn)換。在這一節(jié)中,你將學(xué)習(xí)如何使用最重要的字符函數(shù)和表達(dá)式。
匹配通配符
假設(shè)你想建立一個(gè)與Yahoo功能相似的Internet目錄。你可以建立一個(gè)表用來(lái)保存一系列的站點(diǎn)名稱,統(tǒng)一資源定位器(URL),描述,和類別,并允許訪問(wèn)者通過(guò)在HTML form中輸入關(guān)鍵字來(lái)檢索這些內(nèi)容。
假如有一個(gè)訪問(wèn)者想從這個(gè)目錄中得到其描述中包含關(guān)鍵字trading card的站點(diǎn)的列表。要取出正確的站點(diǎn)列表,你也許試圖使用這樣的查詢:
SELECT site_name FROM site_directory WHERE site_desc=’trading card’
這個(gè)查詢可以工作。但是,它只能返回那些其描述中只有trading card這個(gè)字符串的站點(diǎn)。例如,一個(gè)描述為We have the greatest collection of trading cards in the world!的站點(diǎn)不會(huì)被返回。
要把一個(gè)字符串與另一個(gè)字符串的一部分相匹配,你需要使用通配符。你使用通配符和關(guān)鍵字LIKE來(lái)實(shí)現(xiàn)模式匹配。下面的語(yǔ)句使用通配符和關(guān)鍵字LIKE重寫(xiě)了上面的查詢,以返回所有正確站點(diǎn)的名字:
SELECT SITE_name FROM site_directory
WHERE site_desc LIKE ‘%trading cark%’
在這個(gè)例子中,所有其描述中包含表達(dá)式trading card的站點(diǎn)都被返回。描述為We have the greatest
collection of trading cards in the world!的站點(diǎn)也被返回。當(dāng)然,如果一個(gè)站點(diǎn)的描述中包含I am
trading cardboard boxes online ,該站點(diǎn)的名字也被返回。
注意本例中百分號(hào)的使用。百分號(hào)是通配符的例子之一。它代表0個(gè)或多個(gè)字符。通過(guò)把trading card括在百分號(hào)中,所有其中嵌有字符串trading card的字符串都被匹配。
現(xiàn)在,假設(shè)你的站點(diǎn)目錄變得太大而不能在一頁(yè)中完全顯示。你決定把目錄分成兩部分。在第一頁(yè),你想顯示所有首字母在A到M之間的站點(diǎn)。在第二頁(yè),你想顯示所有首字母在N到Z之間的站點(diǎn)。要得到第一頁(yè)的站點(diǎn)列表,你可以使用如下的SQL語(yǔ)句:
SELECT site_name FROM site_directory WHERE site_name LIKE ‘[A-M]%’
在這個(gè)例子中使用了表達(dá)式[A-M],只取出那些首字母在A到M之間的站點(diǎn)。中括號(hào)([])用來(lái)匹配處在指定范圍內(nèi)的單個(gè)字符。要得到第二頁(yè)中顯示的站點(diǎn),應(yīng)使用這個(gè)語(yǔ)句:
SELECT site_name FROM site_directory
WHERE site_name LIKE ‘[N-Z]%’
在這個(gè)例子中,括號(hào)中的表達(dá)式代表任何處在N到Z之間的單個(gè)字符。
假設(shè)你的站點(diǎn)目錄變得更大了,你現(xiàn)在需要把目錄分成更多頁(yè)。如果你想顯示那些以A,B或C開(kāi)頭的站點(diǎn),你可以用下面的查詢來(lái)實(shí)現(xiàn):
SELECT site_name FROM site_directory WHERE site_name LIKE ‘[ABC]%’
在這個(gè)例子中,括號(hào)中的表達(dá)式不再指定一個(gè)范圍,而是給出了一些字符。任何一個(gè)其名字以這些字符中的任一個(gè)開(kāi)頭的站點(diǎn)都將被返回。
通過(guò)在括號(hào)內(nèi)的表達(dá)式中同時(shí)包含一個(gè)范圍和一些指定的字符,你可以把這兩種方法結(jié)合起來(lái)。例如,用下面的這個(gè)查詢,你可以取出那些首字母在C到F之間,或者以字母Y開(kāi)頭的站點(diǎn):
SELECT site_name FROM site_directory WHERE site_name LIKE ‘[C-FY]%’
在這個(gè)例子中,名字為Collegescape和Yahoo的站點(diǎn)會(huì)被選取,而名字為Magicw3的站點(diǎn)則不會(huì)被選取。
你也可以使用脫字符(^)來(lái)排除特定的字符。例如,要得到那些名字不以Y開(kāi)頭的站點(diǎn),你可以使用如下的查詢:
SELECT site_name FROM site_directory WHERE site_name LIKE ‘[^Y]%’
對(duì)給定的字符或字符范圍均可以使用脫字符。
最后,通過(guò)使用下劃線字符(_),你可以匹配任何單個(gè)字符。例如,下面這個(gè)查詢返回每一個(gè)其名字的第二個(gè)字符為任何字母的站點(diǎn):
SELECT site_name FROM site_directory WHERE site_name LIKE ‘M_crosoft’
這個(gè)例子既返回名為Microsoft的站點(diǎn),也返回名為Macrosoft的站點(diǎn)。但是,名字為Moocrosoft的站點(diǎn)則不被返回。與通配符’%’不同,下劃線只代表單個(gè)字符。
注意:
如果你想匹配百分號(hào)或下劃線字符本身,你需要把它們括在方括號(hào)中。如果你想匹配連字符(-),應(yīng)把它指定為方括號(hào)中的第一個(gè)字符。如果你想匹配方括號(hào),應(yīng)把它們也括在方括號(hào)中。例如,下面的語(yǔ)句返回所有其描述中包含百分號(hào)的站點(diǎn):
SELECT site_name FROM site_directory WHERE site_desc LIKE ‘%[%]%’
匹配發(fā)音\r
Microsoft SQL
有兩個(gè)允許你按照發(fā)音來(lái)匹配字符串的函數(shù)。函數(shù)SOUNDEX()給一個(gè)字符串分配一個(gè)音標(biāo)碼,函數(shù)DIFFERENCE()按照發(fā)音比較兩個(gè)字符串。當(dāng)
你不知道一個(gè)名字的確切拼寫(xiě),但多少知道一點(diǎn)它的發(fā)音時(shí),使用這兩個(gè)函數(shù)將有助于你取出該記錄。
例如,如果你建立一個(gè)Internet目錄,你也許想增加一個(gè)選項(xiàng),允許訪問(wèn)者按照站點(diǎn)名的發(fā)音來(lái)搜索站點(diǎn),而不是按名字的拼寫(xiě)。考慮如下的語(yǔ)句:
SELECT site_name FROM site_directory
WHERE DIFFERENCE(site_name , ‘Microsoft’>3
這個(gè)語(yǔ)句使用函數(shù)DEFFERENCE()來(lái)取得其名字的發(fā)音與Microsoft非常相似的站點(diǎn)。函數(shù)DIFFERENCE()返回一個(gè)0到4之間的數(shù)字。如果該函數(shù)返回4,表示發(fā)音非常相近;如果該函數(shù)返回0,說(shuō)明這兩個(gè)字符串的發(fā)音相差很大。
例如,上面的語(yǔ)句將返回站點(diǎn)名Microsoft和Macrosoft。這兩個(gè)名字的發(fā)音與Microsoft都很相似。如果你把上一語(yǔ)句中的大于3改為
大于2,那么名為Zicrosoft和Megasoft的站點(diǎn)也將被返回。最后,如果你只需要差別等級(jí)大于1即可,則名為Picosoft和
Minisoft的站點(diǎn)也將被匹配。
要深入了解函數(shù)DIFFERENCE()是如何工作的,你可以用函數(shù)SOUNDEX()來(lái)返回函數(shù)DIFFERENCE()所使用的音標(biāo)碼。這里有一個(gè)例子:
SELECT site_name ‘site name’,SOUNDEX(site_name) ‘sounds like’
這個(gè)語(yǔ)句選取字段site_name的所有數(shù)據(jù)及其音標(biāo)碼。下面是這個(gè)查詢的結(jié)果:
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)
如果你仔細(xì)看一下音標(biāo)碼,你會(huì)注意到音標(biāo)碼的第一個(gè)字母與字段值的第一個(gè)字母相同。例如,Yahoo和Mahoo的音標(biāo)碼只有第一個(gè)字母不同。你還可以發(fā)現(xiàn)Microsoft和Macrosoft的音標(biāo)碼完全相同。
函數(shù)DIFFERENDE()比較兩個(gè)字符串的第一個(gè)字母和所有的輔音字母。該函數(shù)忽略任何元音字母(包括y),除非一個(gè)元音字母是一個(gè)字符串的第一個(gè)字母。
不幸的是,使用SOUNDEX()和DIFFERENCE()有一個(gè)欠缺。WHERE子句中包含這兩個(gè)函數(shù)的查詢執(zhí)行起來(lái)效果不好。因此,你應(yīng)該小心使用這兩個(gè)函數(shù)。
刪除空格
有兩個(gè)函數(shù),TTRIM()和LTRIM(),可以用來(lái)從字符串中剪掉空格。函數(shù)LTRIM()去除應(yīng)該字符串前面的所有空格;函數(shù)RTRIM()去除一個(gè)字符串尾部的所有空格。這里有一個(gè)任何使用函數(shù)RTRIM()的例子:
SELECT RTRIM(site_name) FROM site_directory
在這個(gè)例子中,如果任何一個(gè)站點(diǎn)的名字尾部有多余的空格,多余的空格將從查詢結(jié)果中刪去。
你可以嵌套使用這兩個(gè)函數(shù),把一個(gè)字符串前后的空格同時(shí)刪去:
SELECT LTRIM(RTRIM(site_name)) FROM site_directory
你會(huì)發(fā)現(xiàn),在從CHAR型字段中剪掉多余的空格時(shí),這兩個(gè)函數(shù)非常有用。記住,如果你把一個(gè)字符串保存在CHAR型字段中,該字符串會(huì)被追加多余的空格,以匹配該字段的長(zhǎng)度。用這兩個(gè)函數(shù),你可以去掉無(wú)用的空格,從而解決這個(gè)問(wèn)題。
刪除空格
update zjkjt.code_subject set code = rtrim(code)
二、利用SQL Update 語(yǔ)句刪除空格
Update Table Set Colname=Replace(Colname," ","")
三、利用SQL Update 語(yǔ)句刪除回車
Update Table Set Colname=Replace(Colname,char(13),"")
三、利用SQL Update 語(yǔ)句刪除硬回車
Update Font Set DemoUrl=Replace(DemoUrl,'
','')
注意:以上語(yǔ)句不要合關(guān)成一行,否則無(wú)法達(dá)到效果。