📄 11-4-3.cfm.htm
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>操作字符串数据</title>
<meta name="GENERATOR" content="Microsoft FrontPage 3.0">
</head>
<body>
<font FACE="宋体"><b>
<p ALIGN="JUSTIFY">操作字符串数据</p>
</b></font><font FACE="宋体" SIZE="3">
<p ALIGN="JUSTIFY">SQL Sever有许多函数和表达式,使你能对字符串进行有趣的操作,包括各种各样的模式匹配和字符转换。在这一节中,你将学习如何使用最重要的字符函数和表达式。</p>
</font><font FACE="宋体"><b>
<p ALIGN="JUSTIFY">匹配通配符</p>
</b></font><font FACE="宋体" SIZE="3">
<p ALIGN="JUSTIFY">假设你想建立一个与Yahoo功能相似的Internet目录。你可以建立一个表用来保存一系列的站点名称,统一资源定位器(URL),描述,和类别,并允许访问者通过在HTML
form中输入关键字来检索这些内容。</p>
<p ALIGN="JUSTIFY">假如有一个访问者想从这个目录中得到其描述中包含关键字trading
card的站点的列表。要取出正确的站点列表,你也许试图使用这样的查询:</p>
<p ALIGN="JUSTIFY">SELECT site_name FROM site_directory WHERE site_desc=</font><font
SIZE="3">’</font><font FACE="宋体" SIZE="3">trading card</font><font SIZE="3">’</p>
</font><font FACE="宋体" SIZE="3">
<p ALIGN="JUSTIFY">这个查询可以工作。但是,它只能返回那些其描述中只有trading
card这个字符串的站点。例如,一个描述为We have the greatest collection of
trading cards in the world!的站点不会被返回。</p>
<p ALIGN="JUSTIFY">要把一个字符串与另一个字符串的一部分相匹配,你需要使用通配符。你使用通配符和关键字LIKE来实现模式匹配。下面的语句使用通配符和关键字LIKE重写了上面的查询,以返回所有正确站点的名字:</p>
<p ALIGN="JUSTIFY">SELECT SITE_name FROM site_directory </p>
<p ALIGN="JUSTIFY">WHERE site_desc LIKE </font><font SIZE="3">‘</font><font
FACE="宋体" SIZE="3">%trading cark%</font><font SIZE="3">’</p>
</font><font FACE="宋体" SIZE="3">
<p ALIGN="JUSTIFY">在这个例子中,所有其描述中包含表达式trading card的站点都被返回。描述为We
have the greatest collection of trading cards in the world!的站点也被返回。当然,如果一个站点的描述中包含I
am trading cardboard boxes online ,该站点的名字也被返回。</p>
<p ALIGN="JUSTIFY">注意本例中百分号的使用。百分号是通配符的例子之一。它代表0个或多个字符。通过把trading
card括在百分号中,所有其中嵌有字符串trading card的字符串都被匹配。</p>
<p ALIGN="JUSTIFY">现在,假设你的站点目录变得太大而不能在一页中完全显示。你决定把目录分成两部分。在第一页,你想显示所有首字母在A到M之间的站点。在第二页,你想显示所有首字母在N到Z之间的站点。要得到第一页的站点列表,你可以使用如下的SQL语句:</p>
<p ALIGN="JUSTIFY">SELECT site_name FROM site_directory WHERE site_name LIKE </font><font
SIZE="3">‘</font><font FACE="宋体" SIZE="3">[A-M]%</font><font SIZE="3">’</p>
</font><font FACE="宋体" SIZE="3">
<p ALIGN="JUSTIFY">在这个例子中使用了表达式[A-M],只取出那些首字母在A到M之间的站点。中括号([])用来匹配处在指定范围内的单个字符。要得到第二页中显示的站点,应使用这个语句:</p>
<p ALIGN="JUSTIFY">SELECT site_name FROM site_directory</p>
<p ALIGN="JUSTIFY">WHERE site_name LIKE </font><font SIZE="3">‘</font><font
FACE="宋体" SIZE="3">[N-Z]%</font><font SIZE="3">’</p>
</font><font FACE="宋体" SIZE="3">
<p ALIGN="JUSTIFY">在这个例子中,括号中的表达式代表任何处在N到Z之间的单个字符。</p>
<p ALIGN="JUSTIFY">假设你的站点目录变得更大了,你现在需要把目录分成更多页。如果你想显示那些以A,B或C开头的站点,你可以用下面的查询来实现:</p>
<p ALIGN="JUSTIFY">SELECT site_name FROM site_directory WHERE site_name LIKE </font><font
SIZE="3">‘</font><font FACE="宋体" SIZE="3">[ABC]%</font><font SIZE="3">’</p>
</font><font FACE="宋体" SIZE="3">
<p ALIGN="JUSTIFY">在这个例子中,括号中的表达式不再指定一个范围,而是给出了一些字符。任何一个其名字以这些字符中的任一个开头的站点都将被返回。</p>
<p ALIGN="JUSTIFY">通过在括号内的表达式中同时包含一个范围和一些指定的字符,你可以把这两种方法结合起来。例如,用下面的这个查询,你可以取出那些首字母在C到F之间,或者以字母Y开头的站点:</p>
<p ALIGN="JUSTIFY">SELECT site_name FROM site_directory WHERE site_name LIKE </font><font
SIZE="3">‘</font><font FACE="宋体" SIZE="3">[C-FY]%</font><font SIZE="3">’</p>
</font><font FACE="宋体" SIZE="3">
<p ALIGN="JUSTIFY">在这个例子中,名字为Collegescape和Yahoo的站点会被选取,而名字为Magicw3的站点则不会被选取。</p>
<p ALIGN="JUSTIFY">你也可以使用脱字符(^)来排除特定的字符。例如,要得到那些名字不以Y开头的站点,你可以使用如下的查询:</p>
<p ALIGN="JUSTIFY">SELECT site_name FROM site_directory WHERE site_name LIKE </font><font
SIZE="3">‘</font><font FACE="宋体" SIZE="3">[^Y]%</font><font SIZE="3">’</p>
</font><font FACE="宋体" SIZE="3">
<p ALIGN="JUSTIFY">对给定的字符或字符范围均可以使用脱字符。</p>
<p ALIGN="JUSTIFY">最后,通过使用下划线字符(_),你可以匹配任何单个字符。例如,下面这个查询返回每一个其名字的第二个字符为任何字母的站点:</p>
<p ALIGN="JUSTIFY">SELECT site_name FROM site_directory WHERE site_name LIKE </font><font
SIZE="3">‘</font><font FACE="宋体" SIZE="3">M_crosoft</font><font SIZE="3">’</p>
</font><font FACE="宋体" SIZE="3">
<p ALIGN="JUSTIFY">这个例子既返回名为Microsoft的站点,也返回名为Macrosoft的站点。但是,名字为Moocrosoft的站点则不被返回。与通配符</font><font
SIZE="3">’</font><font FACE="宋体" SIZE="3">%</font><font SIZE="3">’</font><font
FACE="宋体" SIZE="3">不同,下划线只代表单个字符。</p>
<p ALIGN="JUSTIFY">注意</p>
<p ALIGN="JUSTIFY">如果你想匹配百分号或下划线字符本身,你需要把它们括在方括号中。如果你想匹配连字符(-),应把它指定为方括号中的第一个字符。如果你想匹配方括号,应把它们也括在方括号中。例如,下面的语句返回所有其描述中包含百分号的站点:</p>
<p ALIGN="JUSTIFY">SELECT site_name FROM site_directory WHERE site_desc LIKE </font><font
SIZE="3">‘</font><font FACE="宋体" SIZE="3">%[%]%</font><font SIZE="3">’</p>
</font><font FACE="宋体"><b>
<p ALIGN="JUSTIFY">匹配发音</p>
</b></font><font FACE="宋体" SIZE="3">
<p ALIGN="JUSTIFY">Microsoft SQL
有两个允许你按照发音来匹配字符串的函数。函数SOUNDEX()给一个字符串分配一个音标码,函数DIFFERENCE()按照发音比较两个字符串。当你不知道一个名字的确切拼写,但多少知道一点它的发音时,使用这两个函数将有助于你取出该记录。</p>
<p ALIGN="JUSTIFY">例如,如果你建立一个Internet目录,你也许想增加一个选项,允许访问者按照站点名的发音来搜索站点,而不是按名字的拼写。考虑如下的语句:</p>
<p ALIGN="JUSTIFY">SELECT site_name FROM site_directory </p>
<p ALIGN="JUSTIFY">WHERE DIFFERENCE(site_name , </font><font SIZE="3">‘</font><font
FACE="宋体" SIZE="3">Microsoft</font><font SIZE="3">’</font><font FACE="宋体"
SIZE="3">>3</p>
<p ALIGN="JUSTIFY">这个语句使用函数DEFFERENCE()来取得其名字的发音与Microsoft非常相似的站点。函数DIFFERENCE()返回一个0到4之间的数字。如果该函数返回4,表示发音非常相近;如果该函数返回0,说明这两个字符串的发音相差很大。</p>
<p ALIGN="JUSTIFY">例如,上面的语句将返回站点名Microsoft和Macrosoft。这两个名字的发音与Microsoft都很相似。如果你把上一语句中的大于3改为大于2,那么名为Zicrosoft和Megasoft的站点也将被返回。最后,如果你只需要差别等级大于1即可,则名为Picosoft和Minisoft的站点也将被匹配。</p>
<p ALIGN="JUSTIFY">要深入了解函数DIFFERENCE()是如何工作的,你可以用函数SOUNDEX()来返回函数DIFFERENCE()所使用的音标码。这里有一个例子:</p>
<p ALIGN="JUSTIFY">SELECT site_name </font><font SIZE="3">‘</font><font FACE="宋体"
SIZE="3">site name</font><font SIZE="3">’</font><font FACE="宋体" SIZE="3">,SOUNDEX(site_name)
</font><font SIZE="3">‘</font><font FACE="宋体" SIZE="3">sounds like</font><font
SIZE="3">’</p>
</font><font FACE="宋体" SIZE="3">
<p ALIGN="JUSTIFY">这个语句选取字段site_name的所有数据及其音标码。下面是这个查询的结果:</p>
<p ALIGN="JUSTIFY">site name sounds like</p>
</font><font SIZE="3">
<p ALIGN="JUSTIFY">……………………………………………………………….</p>
<p ALIGN="JUSTIFY">Yahoo Y000</p>
<p ALIGN="JUSTIFY">Mahoo M000</p>
<p ALIGN="JUSTIFY">Microsoft M262</p>
<p ALIGN="JUSTIFY">Macrosoft M262</p>
<p ALIGN="JUSTIFY">Minisoft M521</p>
<p ALIGN="JUSTIFY">Microshoft M262</p>
<p ALIGN="JUSTIFY">Zicrosoft Z262</p>
<p ALIGN="JUSTIFY">Zaposoft Z121</p>
<p ALIGN="JUSTIFY">Millisoft M421</p>
<p ALIGN="JUSTIFY">Nanosoft N521</p>
<p ALIGN="JUSTIFY">Megasoft M221</p>
<p ALIGN="JUSTIFY">Picosoft P221</p>
<p ALIGN="JUSTIFY">(12 row(s) affected)</p>
</font><font FACE="宋体" SIZE="3">
<p ALIGN="JUSTIFY">如果你仔细看一下音标码,你会注意到音标码的第一个字母与字段值的第一个字母相同。例如,Yahoo和Mahoo的音标码只有第一个字母不同。你还可以发现Microsoft和Macrosoft的音标码完全相同。</p>
<p ALIGN="JUSTIFY">函数DIFFERENDE()比较两个字符串的第一个字母和所有的辅音字母。该函数忽略任何元音字母(包括y),除非一个元音字母是一个字符串的第一个字母。</p>
<p ALIGN="JUSTIFY">不幸的是,使用SOUNDEX()和DIFFERENCE()有一个欠缺。WHERE子句中包含这两个函数的查询执行起来效果不好。因此,你应该小心使用这两个函数。</p>
</font>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -