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 coll
ection 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和要深⼊了解函数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、VARCHAR、BINARY、和VARBINARY 数据类型以及可以隐式转换为CHAR 或VARCHAR的数据类型。常⽤的字符串函数有:
⼀、字符转换函数
1、ASCII()
返回字符表达式最左端字符的ASCII 码值。在ASCII()函数中,纯数字的字符串可不⽤‘’括起来,但含其它字符的字符串必须⽤‘’括起来使⽤,否则会出错。
2、CHAR()
将ASCII 码转换为字符。如果没有输⼊0 ~255之间的ASCII 码值,CHAR()返回NULL 。
3、LOWER()和UPPER()
LOWER()将字符串全部转为⼩写;UPPER()将字符串全部转为⼤写。
4、STR()
把数值型数据转换为字符型数据。
STR (<float_expression>[,length[, <decimal>]])
length 指定返回的字符串的长度,decimal指定返回的⼩数位数。如果没有指定长度,缺省的length 值为10,decimal缺省值为0。
当length 或者decimal 为负值时,返回NULL;
当length ⼩于⼩数点左边(包括符号位)的位数时,返回length 个*;
先服从length ,再取decimal ;
当返回的字符串位数⼩于length ,左边补⾜空格。
⼆、去空格函数
1、LTRIM() 把字符串头部的空格去掉。
2、RTRIM() 把字符串尾部的空格去掉。
三、取⼦串函数
1、left()
LEFT (<character_expression>,<integer_expression>)
返回character_expression 左起 integer_expression 个字符。
2、RIGHT()
RIGHT (<character_expression>,<integer_expression>)
返回character_expression 右起 integer_expression 个字符。
3、SUBSTRING()
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
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
四、字符串⽐较函数
1、CHARINDEX()
返回字符串中某个指定的⼦串出现的开始位置。
CHARINDEX (<’substring_expression’>,<expression>)
其中substring _expression 是所要查的字符表达式,expression 可为字符串也可为列名表达式。如果没有发现⼦串,则返回0 值。
此函数不能⽤于TEXT 和IMAGE 数据类型。
2、PATINDEX()
返回字符串中某个指定的⼦串出现的开始位置。
PATINDEX (<’%substring _expression%’>,<column_ name>)其中⼦串表达式前后必须有百分号“%”否则返回值为0。
与CHARINDEX 函数不同的是,PATINDEX函数的⼦串中可以使⽤通配符,且此函数可⽤于CHAR、VARCHAR和TEXT 数据类型。
五、字符串操作函数
1、QUOTENAME()
返回被特定字符括起来的字符串。
QUOTENAME (<’character_expression’>[, quote_ character]) 其中quote_ character标明括字符串所⽤的字符,缺省值为“[]”。
2、REPLICATE()
返回⼀个重复character_expression 指定次数的字符串。
REPLICATE (character_expression integer_expression) 如果integer_expression 值为负值,则返回NULL 。
3、REVERSE()
将指定的字符串的字符排列顺序颠倒。
REVERSE (<character_expression>) 其中character_expression 可以是字符串、常数或⼀个列的值。
4、REPLACE()
返回被替换了指定⼦串的字符串。
REPLACE (<string_expression1>,<string_expression2>,<string_expression3>) ⽤string_expression3 替换在string_expression1 中的⼦串string_expression2。
4、SPACE()
返回⼀个有指定长度的空⽩字符串。
SPACE (<integer_expression>) 如果integer_expression 值为负值,则返回NULL 。
5、STUFF()
⽤另⼀⼦串替换字符串指定位置、长度的⼦串。
STUFF (<character_expression1>,<start_ position>,<length>,<character_expression2>)
如果起始位置为负或长度值为负,或者起始位置⼤于character_expression1 的长度,则返回NULL 值。
如果length 长度⼤于character_expression1 中 start_ position 以右的长度,则character_expression1 只保留⾸字符。
sql语句替换表中内容六、数据类型转换函数
1、CAST()
CAST (<expression>AS<data_ type>[ length ])
2、CONVERT()
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 系统提供的转换样式编号,不同的样式编号有不同的输出格式。
七、⽇期函数
1、day(date_expression)
返回date_expression中的⽇期值
2、month(date_expression)
返回date_expression中的⽉份值
3、year(date_expression)
返回date_expression中的年份值
4、DATEADD()
DATEADD (<datepart>,<number>,<date>)
返回指定⽇期date 加上指定的额外⽇期间隔number 产⽣的新⽇期。
5、DATEDIFF()
DATEDIFF (<datepart>,<date1>,<date2>)
返回两个指定⽇期在datepart ⽅⾯的不同之处,即date2 超过date1的差距值,其结果值是⼀个带有正负号的整数值。
6、DATENAME()
DATENAME (<datepart>,<date>)
以字符串的形式返回⽇期的指定部分此部分。由datepart 来指定。
7、DATEPART()
DATEPART (<datepart>,<date>)
以整数值的形式返回⽇期的指定部分。此部分由datepart 来指定。
DATEPART (dd, date) 等同于DAY (date)
DATEPART (mm, date) 等同于MONTH (date)
DATEPART (yy, date) 等同于YEAR (date)
8、GETDATE()
以DATETIME 的缺省格式返回系统当前的⽇期和时间。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。