sql中的字符串匹配、函數大全


假設你想建立一個與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()去除一個字符串尾部的所有空格。這些和vbscript中的同名函數功能是一致的。
這里有一個任何使用函數RTRIM()的例子:

SELECT RTRIM(site_name) FROM site_directory

在這個例子中,假如任何一個站點的名字尾部有多余的空格,多余的空格將從查詢結果中刪去。
你可以嵌套使用這兩個函數,把一個字符串前后的空格同時刪去:

SELECT LTRIM(RTRIM(site_name) FROM site_directory

你會發現,在從CHAR型字段中剪掉多余的空格時,這兩個函數非常有用。記住,假如你把一個字符串保存在CHAR型字段中,該字符串會被追加多余的空格,以匹配該字段的長度。用這兩個函數,你可以去掉無用的空格,從而解決這個問題。

select 字段1 from 表1 where 字段1.IndexOf("雲")=1;
這條語句不對的原因是indexof()函數不是sql函數,改成sql對應的函數就可以了。
left()是sql函數。
select 字段1 from 表1 where charindex'',字段1)=1; 字符串函數對二進制數據、字符串和表達式執行不同的運算。此類函數作用於CHAR、VARCHARBINARY、 和VARBINARY 數據類型以及可以隱式轉換為CHAR 或VARCHAR的數據類型。可以在SELECT 語句的SELECT 和WHERE 子句以及表達式中使用字符串函數。
常用的字符串函數有:

一、字符轉換函數
1ASCII()
返回字符表達式最左端字符的ASCII 碼值。在ASCII()函數中,純數字的字符串可不用‘’括起來,但含其它字符的字符串必須用‘’括起來使用,否則會出錯。
2CHAR()
將ASCII 碼轉換為字符。如果沒有輸入0 ~ 255 之間的ASCII 碼值,CHAR() 返回NULL 。
3LOWER()和UPPER()
LOWER()將字符串全部轉為小寫;UPPER()將字符串全部轉為大寫。
4STR()
把數值型數據轉換為字符型數據。
STR (<float_expression>[,length[, <decimal>]])
length 指定返回的字符串的長度,decimal 指定返回的小數位數。如果沒有指定長度,缺省的length 值為10, decimal 缺省值為0。
當length 或者decimal 為負值時,返回NULL;
當length 小於小數點左邊(包括符號位)的位數時,返回length 個*;
先服從length ,再取decimal ;
當返回的字符串位數小於length ,左邊補足空格。
二、去空格函數
1LTRIM() 把字符串頭部的空格去掉。

2RTRIM() 把字符串尾部的空格去掉。

三、取子串函數
1left()
LEFT (<character_expression><integer_expression>)
返回character_expression 左起 integer_expression 個字符。

2RIGHT()
RIGHT (<character_expression><integer_expression>)
返回character_expression 右起 integer_expression 個字符。

3SUBSTRING()
SUBSTRING (<expression><starting_ position>, length)
返回從字符串左邊第starting_ position 個字符起length個字符的部分。

已知: 字段A='F:\photo\Winter Leaves.jpg' 
要求:分段截取每段字符[字段A不能為TEXT類型,否則報錯]
解決方法:
+++++++++++++++++++++++++++++++++++++++++++++++++++


---截取字符串A的第一個\左邊的字符串
select left(A,charindex('/',A)-1)
輸出結果:F:
++++++++++++++++++++++++++++++++++++++++++++++++++++

---截取\中間的字符串
select left(stuff(A,1,charindex('/',A),''),charindex('/',stuff(A,1,charindex('/',A),''))-1)
輸出結果:photo
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++


---截取最后一個\后面的字符串
select reverse(left(reverse(A),charindex('/',reverse(A))-1))
輸出結果:Winter Leaves.jpg
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

---截取字符串A的首字幕
select STUFF(A,1, 1, '')
輸出結果::\photo\Winter Leaves.jpg
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

四、字符串比較函數
1CHARINDEX()
返回字符串中某個指定的子串出現的開始位置。
CHARINDEX (<’substring_expression’><expression>)
其中substring _expression 是所要查找的字符表達式,expression 可為字符串也可為列名表達式。如果沒有發現子串,則返回0 值。
此函數不能用於TEXT 和IMAGE 數據類型。
2PATINDEX()
返回字符串中某個指定的子串出現的開始位置。
PATINDEX (<%substring _expression%><column_ name>)其中子串表達式前后必須有百分號“%”否則返回值為0。
與CHARINDEX 函數不同的是,PATINDEX函數的子串中可以使用通配符,且此函數可用於CHAR、 VARCHAR 和TEXT 數據類型。

五、字符串操作函數
1QUOTENAME()
返回被特定字符括起來的字符串。
QUOTENAME (<’character_expression’>[, quote_ character]) 其中quote_ character 標明括字符串所用的字符,缺省值為“[]”。
2REPLICATE()
返回一個重復character_expression 指定次數的字符串。
REPLICATE (character_expression integer_expression) 如果integer_expression 值為負值,則返回NULL 。

3REVERSE()
將指定的字符串的字符排列順序顛倒。
REVERSE (<character_expression>) 其中character_expression 可以是字符串、常數或一個列的值。

4REPLACE()
返回被替換了指定子串的字符串。
REPLACE (<string_expression1><string_expression2><string_expression3>) 用string_expression3 替換在string_expression1 中的子串string_expression2。

4SPACE()
返回一個有指定長度的空白字符串。
SPACE (<integer_expression>) 如果integer_expression 值為負值,則返回NULL 。

5STUFF()
用另一子串替換字符串指定位置、長度的子串。
STUFF (<character_expression1><start_ position><length><character_expression2>)
如果起始位置為負或長度值為負,或者起始位置大於character_expression1 的長度,則返回NULL 值。
如果length 長度大於character_expression1 中 start_ position 以右的長度,則character_expression1 只保留首字符。
六、數據類型轉換函數
1CAST()
CAST (<expression> AS <data_ type>[ length ])

2CONVERT()
CONVERT (<data_ type>[ length ]<expression> [, style])

1)data_type為SQL Server系統定義的數據類型,用戶自定義的數據類型不能在此使用。
2)length用於指定數據的長度,缺省值為30。
3)把CHAR或VARCHAR類型轉換為諸如INT或SAMLLINT這樣的INTEGER類型、結果必須是帶正號或負號的數值。
4)TEXT類型到CHAR或VARCHAR類型轉換最多為8000個字符,即CHAR或VARCHAR數據類型是最大長度。
5)IMAGE類型存儲的數據轉換到BINARY或VARBINARY類型,最多為8000個字符。
6)把整數值轉換為MONEY或SMALLMONEY類型,按定義的國家的貨幣單位來處理,如人民幣、美元、英鎊等。
7)BIT類型的轉換把非零值轉換為1,並仍以BIT類型存儲。
8)試圖轉換到不同長度的數據類型,會截短轉換值並在轉換值后顯示“+”,以標識發生了這種截斷。
9)用CONVERT()函數的style 選項能以不同的格式顯示日期和時間。style 是將DATATIME 和SMALLDATETIME 數據轉換為字符串時所選用的由SQL Server 系統提供的轉換樣式編號,不同的樣式編號有不同的輸出格式。
七、日期函數
1day(date_expression)
返回date_expression中的日期值

2month(date_expression)
返回date_expression中的月份值

3year(date_expression)
返回date_expression中的年份值

4DATEADD()
DATEADD (<datepart><number><date>)
返回指定日期date 加上指定的額外日期間隔number 產生的新日期。
5DATEDIFF()
DATEDIFF (<datepart><date1><date2>)
返回兩個指定日期在datepart 方面的不同之處,即date2 超過date1的差距值,其結果值是一個帶有正負號的整數值。

6DATENAME()
DATENAME (<datepart><date>)
以字符串的形式返回日期的指定部分此部分。由datepart 來指定。

7DATEPART()
DATEPART (<datepart><date>)
以整數值的形式返回日期的指定部分。此部分由datepart 來指定。
DATEPART (dd, date) 等同於DAY (date)
DATEPART (mm, date) 等同於MONTH (date)
DATEPART (yy, date) 等同於YEAR (date)

8GETDATE()
以DATETIME 的缺省格式返回系統當前的日期和時間。

 


免責聲明!

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



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