SQL数据操作基础(中级)9

SQL数据操作基础(中级)9,第1张

SQL数据操作基础(中级)9,第2张

转换数据

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字段中保存一个字符串,该字符串将被附加上额外的空单元格,以匹配字段的长度。有了这两个函数,去掉无用的空格就可以解决这个问题了。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » SQL数据操作基础(中级)9

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情