SQL数据操作基础(中级)9
转换数据
SQL Sever足够强大,可以在需要时将大多数数值从一种类型转换为另一种类型。比如比较SMALLINT数据和INT数据的大小,不需要显式的类型转换。SQL Sever将为您完成这项工作。但是,当您想要在字符数据和其他类型的数据之间进行转换时,您确实需要自己进行转换。例如,假设您想从一个货币字段中获取所有值,并将字符串“US Dollars”添加到结果中。您需要使用CONVERT()函数,如下例所示:
从订单中选择CONVERT(CHAR(8),price)+'美元'
CONVERT()函数有两个变量。第一个变量指定数据类型和长度。第二个变量指定要转换的字段。在本例中,字段price被转换为长度为8个字符的CHAR字段。字段price必须转换为字符类型,然后可以将字符串“US Dollars”连接到它。
当向BIT、DATETIME、INT或NUMERIC字段添加字符串时,需要进行相同的转换。例如,以下语句将字符串“The vote is”添加到SELECT语句的查询结果中,该语句返回一个位字段的值:
SELECT ' The vote is '+CONVERT(CHAR(1),vote) FROM opinion
下面是该语句结果的一个示例:
投票结果是1
投票结果是1
投票结果是0
(受影响的3行)
如果不进行显式转换,您将收到以下错误消息:
不允许从数据类型“varchar”到“bit”的隐式转换。
使用CONVERT函数运行此查询。
操作字符串数据
SQL Sever有许多函数和表达式,使您能够对字符串执行有趣的操作,包括各种模式匹配和字符转换。在本节中,您将学习如何使用最重要的角色函数和表达式。
匹配通配符
假设你想建立一个类似雅虎功能的互联网目录。您可以设置一个表来存储一系列站点名称、统一资源定位器(URL)、描述和类别,并允许访问者通过以HTML形式输入关键字来检索这些内容。
假设一个访问者想从这个目录中获取一个网站列表,这些网站的描述包含关键字trading card。要获得正确的站点列表,您可以尝试使用如下查询:
从站点目录中选择站点名称,其中站点desc= '交易卡'
这个查询可以工作。但是,它只能返回那些描述中只包含字符串trading card的站点。例如,描述是我们拥有世界上最大的交易卡收藏!该网站将不会被归还。
要将一个字符串与另一个字符串的一部分匹配,需要使用通配符。你使用通配符和关键字来实现模式匹配。以下语句使用通配符和关键字改写了上述查询,以返回所有正确站点的名称:
从站点目录中选择站点名称
where _ desc like“% trading cark %”
在此示例中,返回其描述包含表达式trading card的所有站点。描述我们拥有世界上最大的交易卡收藏!还会返回的站点。当然,如果我在网上交易纸箱是包含在一个网站的描述,网站的名称也被返回。
注意这个例子中分号的使用。百分号是通配符的一个例子。它代表0个或多个字符。通过将交易卡括在百分号中,所有嵌入交易卡字符串的字符串都匹配。
现在,假设您的站点目录变得太大,无法完全显示在一个页面中。你决定把目录分成两部分。在第一页上,您希望显示首字母介于A和m之间的所有站点。在第二页上,您希望显示首字母介于N和z之间的所有站点。要在第一页上获得站点列表,您可以使用以下SQL语句:
从站点目录中选择站点名称,其中站点名称类似于“[A-M]%”
在这个例子中,使用了表达式[A-M],只取出那些首字母在A和M之间的站点。方括号([])用于匹配指定范围内的单个字符。要使站点显示在第二页上,您应该使用以下语句:
从站点目录中选择站点名称
其中站点名称类似“[N-Z]%”
在本例中,括号中的表达式表示N和z之间的任何单个字符。
假设你的站点目录变大了,你现在需要把目录分成更多的页面。如果您想显示那些以A、B或C开头的站点,您可以使用以下查询:
从站点目录中选择站点名称,其中站点名称类似“[ABC]%”
在这个例子中,括号中的表达式不再指定范围,而是给出一些字符。任何以这些字符开头的站点都将被返回。
通过在括号中的表达式中包含一个范围和一些指定的字符,可以将这两种方法结合起来。例如,通过下面的查询,您可以找出那些首字母介于C和F之间的站点,或者以字母Y开头的站点:
从站点目录中选择站点名称,其中站点名称类似“[C-FY]%”
在本例中,将选择名为Collegescape和Yahoo的站点,而名为Magicw3的站点将不会被选择。
您还可以使用插入符号(^)来排除特定字符。例如,要获取名称不以Y开头的站点,可以使用以下查询:
从站点目录中选择站点名称,其中站点名称类似于'[^Y]%'
对于给定的字符或字符范围,可以使用插入符号。
最后,通过使用下划线字符(_),您可以匹配任何单个字符。例如,以下查询返回第二个字符是任意字母的每个站点:
从站点目录中选择站点名称,其中站点名称类似于“M_crosoft”
本示例返回名为Microsoft的网站和名为Macrosoft的网站。但是,名为Moocrosoft的站点没有返回。与通配符“%”不同,下划线仅代表一个字符。
注意:
如果您想匹配百分号或下划线字符本身,您需要用方括号将它们括起来。如果要匹配连字符(-),应该将其指定为方括号中的第一个字符。如果要匹配方括号,应该用方括号括起来。例如,以下语句返回描述中包含百分号的所有站点:
从站点目录中选择站点名称,其中站点desc类似于“%[%]%”
匹配发音
Microsoft SQL有两个函数允许您通过发音来匹配字符串。SOUNDEX()函数为一个字符串分配一个语音代码,DIFFERENCE()函数根据两个字符串的发音进行比较。当你不知道一个名字的确切拼写,但知道一点它的发音时,使用这两个功能会帮助你取出记录。
例如,如果您建立了一个Internet目录,您可能希望添加一个选项,允许访问者通过网站名称的发音而不是名称的拼写来搜索网站。考虑以下语句:
从站点目录中选择站点名称
WHERE DIFFERENCE(site_name,' Microsoft'>3
该语句使用函数DEFFERENCE()来获取其名称听起来与Microsoft的名称非常相似的站点。函数DIFFERENCE()返回一个介于0和4之间的数字。如果函数返回4,说明发音很像;如果这个函数返回0,那么这两个字符串的发音差别很大。
例如,上面的语句将返回站点名称Microsoft和Macrosoft。这两个名字的发音和微软差不多。如果在前面的语句中将大于3改为大于2,那么名为Zicrosoft和Megasoft的站点也将返回。最后,如果您只需要大于1的差异级别,名为Picosoft和Minisoft的站点也将被匹配。
要进一步了解函数DIFFERENCE()的工作原理,可以使用函数SOUNDEX()返回函数DIFFERENCE()使用的语音代码。下面是一个例子:select site _ name '站点名称',soundex (site _ name)'声音像'
该语句选择字段site_name及其语音代码的所有数据。以下是该查询的结果:
网站名称听起来像
……………………………………………………………….
雅虎Y000
Mahoo M000
微软M262
宏软M262
Minisoft M521
Microshoft M262
Zicrosoft Z262
Zaposoft Z121
Millisoft M421
纳米软件N521
兆软M221
微微软件P221
(受影响的12行)
如果您仔细查看语音代码,您会注意到语音代码的第一个字母与字段值的第一个字母相同。比如Yahoo和Mahoo的音码只差第一个字母。还可以发现微软和Macrosoft的音标是一模一样的。
函数DIFFERENDE()比较两个字符串的首字母和所有辅音字母。该函数忽略任何元音(包括Y),除非元音是字符串的第一个字母。
不幸的是,使用SOUNDEX()和DIFFERENCE()有一个缺陷。在WHERE子句中包含这两个函数的查询性能不佳。因此,您应该谨慎使用这两个函数。
删除空网格。
有两个函数,TTRIM()和LTRIM(),可用于从字符串中截取空单元格。函数LTRIM()删除字符串前面的所有空单元格;函数的作用是:删除字符串末尾的所有空单元格。下面是一个使用RTRIM()函数的例子:
从站点目录中选择RTRIM(站点名称)
在这个例子中,如果在任何站点名称的末尾有一个额外的空网格,那么这个额外的空网格将从查询结果中删除。
您可以嵌套这两个函数,并删除字符串前后的空框:
从站点目录中选择LTRIM(RTRIM(站点名称)
你会发现这两个函数在从CHAR字段中切掉多余的空单元格时非常有用。请记住,如果您在CHAR字段中保存一个字符串,该字符串将被附加上额外的空单元格,以匹配字段的长度。有了这两个函数,去掉无用的空格就可以解决这个问题了。
位律师回复
0条评论