SQL Server 2000中CASE语句与函数的综合运用

时间:2022-10-09 01:14:58

SQL Server 2000中CASE语句与函数的综合运用

摘 要:在sql server 2000数据库中综合运用Transact―SQL语言的case语句函数,可以方便灵活地解决多分支控制流程的问题。

关键词:SQL Server 2000 Transact―SQL语言 CASE语句 函数 综合运用

数据库是计算机应用的一项重要技术。随着计算机、网络通信等技术的发展,在网络多用户环境下对数据进行安全有效的管理已成为计算机的一项重要应用。SQL Server 2000是微软公司推出的基于SQL标准的关系型大型数据库管理系统。

它功能强大,易学易用,与Windows 2000相结合,可以构造网络环境数据库甚至分布式数据库,可以满足企业及Internet等大型数据库的应用,当前使用十分普遍。

SQL Server 2000系统所使用的SQL语言称为Transact―SQL。Transact―SQL是用于管理SQL Server 2000实例,创建和管理SQL Server 2000实例中的所有对象,并且插入、检索、修改和删除SQL Server 2000数据表中数据的命令语言,它是SQL Server 2000数据库管理系统的核心。

使用Transact―SQL脚本可以编写存储过程,完成建立和操作数据库、数据查询、数据管理等工作。Transact―SQL语言可以在SQL Server 2000提供的查询分析器上执行,查询分析器是一个具有执行SQL脚本、分析查询性能和调试存储过程等功能的管理工具。它是SQL Server 2000系统中最常用的操作管理工具,利用它可以输入、调试、运行SQL语句。

使用Transact―SQL的变量、运算符、函数和流程控制语句等基本语言元素,可以进一步丰富查询操作,实现数据库应用系统的复杂功能。

Transact―SQL语言中的CASE语句可以根据多个选择决定程序执行的流程。相当于if-else语句的嵌套,但结构更清楚。

简单CASE语句

・语法格式

CASE输入表达式

WHEN比较表达式THEN结果表达式[...n]

[ELSE最终结果表达式]

END

・功能将输入表达式的值与每一个比较表达式比较,若相等,则返回对应结果表达式的值;否则返回最终结果表达式的值。最终结果表达式也可以省略。输入表达式和每个比较表达式的数据类型必须相同,或者可以隐式转换。

[...n]表示可以使用多个“WHEN ... THEN”表达式子句。

例如:使用CASE语句根据输入的学生分数,输出对应的等级,这个问题如果用C语言的switch语句很好完成,C语言程序如下:

main()

{int score

printf("Please enter a score:");

scanf("%d",&score);

printf("score=%d:",score)

switch(score/10)

{case 10:

case 9:printf("A/n");break;/*分数在90分以上,则输出A*/

case 8:printf("B/n");break;

case 7:printf("C/n");break;

case 6:printf("D/n");break;

default:printf("E/n");break;

}

}

若用Transact―SQL语言的CASE语句来做则会遇到一些问题,Transact―SQL语言大多数情况下是对表中数据进行操作,本例题中所使用的分数就来自于choice表,如按照C语言模式写成如下程序:

use teachdb

select sno,score=

case score/10

when 9 thenprint"优"

when 8 thenprint"良"

when 7 thenprint"中"

when 6 thenprint"及"

elseprint"不及格"

end

from choice go

则产生错误,因为sno是表中字段,它的运行结果会在“网格”标签内显示,而print命令是在查询分析器窗口的“消息”标签中显示用户信息。且该例中的print语句属于结果表达式,print语句的结果应赋值给score字段,而它们的类型又不匹配,所以这么设计在语法结构上就存在缺陷。第一次修改程序时,取消print语句改为score,以验证问题是否是因为类型不匹配造成的。修改后程序能正常运行说明语法上没有问题,但所有score字段的结果都显示为“NULL”,与预想的结果不符(预想的结果应为该生对应的分数),初步分析是输入表达式score/10与比较表达式9,……,6都不匹配。

进入企业管理器查看choice表中score字段的类型为数值型,且学生具体分数值有小数部分,于是考虑将score小数部分去掉,ceiling()函数的功能是:返回大于或等于给定值的最小整数。将score/10改为ceiling(score)/10,再运行程序,所有score字段的结果仍为“NULL”,单独执行print ceiling(82.5)/10观察其结果为:8.0,说明虽然去掉了小数部分,但其值仍为数值型,而比较表达式的值为整型所以不匹配,cast()函数的功能为:把一种数据类型强制转换为另一种数据类型,再将ceiling(score)/10改为cast(ceiling(score)/10 as int),运行程序,所有score字段的结果为该生对应的分数,结果正确。

接下来考虑如何让学号后面出现的不是对应分数而是对应等级,前面已经分析score字段与print语句的类型不匹配,所以将表中已有的score字段换成新加入的grade字段,即程序运行后新生成一个结果字段,程序如下:

use teachdb

select sno,grade--grade并不是表中已有的列

case cast(CEILING(score)/10as int)

when 9 then"优"--分数在90分以上,则输出“优”

when 8 then"良"

when 7 then"中"

when 6 then"及"

else"不及格"

end

from choice go

实验证明通过CASE语句与函数的综合运用,可以方便灵活地解决多分支控制流程的问题。

参考文献:

[1]谭浩强.《C程序设计》.清华出版社,1991.

[2]周力. 《SQL Server 2000实用教程》.大连理工大学出版社,2009.

[3]田淑清,周海燕,赵重敏等.《全国计算机等级考试二级教程――C语言程序设计》.高等教育出版社,1998.

上一篇:谈中学体育教学中学生自信心的培养 下一篇:初级剑术教学法探讨