Transact SQL教程(三)

使用CASE控制语句执行

假设你想在网页上显示你喜欢站点的名称,URL,和关于它的简单描述。更进一步,你想在列出这些站点时在站点的名称旁边指明每一个网站的类型。比 如,在政府机关网站的旁边,你会显示单词Government;在商业网站的旁边,显示单词Commercial。为了做到这一点,你可能会创建一个具有 4列的表。前三列和原先的一样,分别是名称列,URL列,简单描述列。另外你可能会添加一个新列,该列为每一个网站的类型。

但在实际上,你不需要这样做…有一种能获得同样的结果但是更好的方法。

按 照上面的做法,你的数据表中就会包含多余的信息。因为在URL列中已经包含了每一个网站类型的信息。通过查看每一个URL最后的三个字母,你就能确定某个 网站是商业的,政府的和教育的等等。所以你不需要在数据表中添加新列重复同样的信息。但是当你在读取数据表中的记录时你是如何在URL列中获取该信息的 呢?你可以使用CASE表达式来做到这一点。如下面的例子所示:

SELECT

CASE

WHEN site_url LIKE “%edu” THEN “Educational”

WHEN site_url LIKE “%gov” THEN “Government”

WHEN site_url LIKE “%com” THEN “Commercial”

ELSE “Other”

END

) “TYPE”,

site_name “Name”,

site_URL “URL”,

site_desc “Description”

FROM site_directory

注意

字母.edu,.gov,和.com都是顶级域名的例子,目前还有许多的顶级域名在使用,比如,假如某个网站的域名以字母.cn结尾,这就指明该网站建在中国大陆。

当上面的SELECT语句执行时,你就会接收到正确的结果。为了返回正确的值,我们使用CASE表达式对site_url列进行了检测。比如,当site_url列的值以三个字母edu结尾时,就会返回值Educational。下面就是从该查询返回结果的一个例子:

Type
Name
URL
Description

……………..
………………
厖厖厖
厖厖厖

Commercial
Microsoft
www.microsoft.com
The Creators of Active Server Pages

Commercial
Yahoo
www.yahoo.com
One of the best Internet Directories

Commercial
Collegescape
www.collegescape.com
Apply to over 50 colleges online

Educational
MIT
www.mit.edu
The Massachusetts Institute of Technology

Government
The whitehouse
www.whitehouse.gov
The residence of the Prisedent

使 用CASE语句,你可以测试不同的条件,并且基于不同的结果返回不同的值。对于每一个测试,都有对应的WHEN短句。在该例子中,当在WHEN短句后面的 语句为真时,返回在相应的THEN短句后面的值。如果没有一个WHEN短句后面的语句为真,则返回在ELSE短句后面的值。

所有的多个WHEN短句和可以选择的单个ELSE短句都必须包含在表达式CASE和END之间。关键字CASE指明CASE语句的开始。而关键字END指明CASE语句的结束。

CASE语句具有另外一种稍微不同的格式。考察在下面的例子内是如何使用CASE语句的:

SELECT

(CASE

site_name

WHEN “Yahoo” THEN “Internet Directory”

WHEN “Microsoft” THEN “Software Giant”

ELSE “Other”

END

)”Type”,

site_name “Name”,

site_URL “URL”,

site_desc “Description”

FROM site_directory

该例子同样显示网站列表的类型,名称,URL和简要描述。所不同的是,在该例子中,每个网站的类型是由网站的名称决定的,而不是URL。下面就是该批处理的结果:

Type
Name
URL
Description

Software Giant
Microsoft
www.microsift.com
The Creators of Active Server Pages

Internet Directory
Yahoo
www.yahoo.com
One of the best Internet Directories

Other
Collegescape
www.collegescape.com
Apply to over 50 college online

Other
MIT
www.mit.edu
The Massachusetts Institute of Technology

Other
The whitehouse
www.whitehouse.gov
The residence of the President

(5 row(s) affected)

请注意在该例子中,CASE例子是如何书写的。在该CASE语句中,在WHEN短语后面并没有跟一个语句,而是要与site_name列的值相比较的值。

当你具有多个条件且每一个条件都是可真或可假时,你必须使用第一种CASE语句格式。假如你需要把一个值和多个值比较时,则使用第二种格式。

使用RETURN语句从批处理中返回

为了从批处理中退出,你可以使用RETURN语句。考察下面的例子:

IF DATENAME(dw,GETDATE())=”Saturday”

BEGIN

PRINT “It is Saturday”

RETURN

END

PRINT “It is some other day”

当该批处理在星期天执行时,在条件语句后面的语句块就会执行。当碰到RETURN语句时,该批处理立即就退出了。这也意味着下面的语句仅仅在不是星期天的某一天显示:

It is some other day

把语句组入到事务中

假如你想在你的网站上出售商业卡。首先,为了做到这一点,你必须创建两个表格,一个表格包含了要付帐的信用卡帐号的列表。另外一个表则包含了定购产品的定单的列表。无论何时,当一个客户在访问你的站点时定购了商业卡,你需要把信息同时添入到两个表格中。

现 在假设有一个访问你站点的客户定购了商业卡。首先该客户的信用卡号添加到信用卡表中。然而就在这一时刻。你Web服务器的硬盘驱动器突然坏了。该客户的定 单并没有保留到产品定单表中。这就会使事情变得很糟糕。来访者的信用卡为商业卡付了账,但是确没有收到定购的产品。此时定购的客户肯定会对你的行为感到生 气。你该怎样阻止该事情的发生呢?

在本节中,将会用到下面的三个语句:BEGIN TRANSACTION,COMMIT TRANSACTION和ROLLBACK TRANSACTION。一个事务(transaction)是一组语句,这组语句要么全部执行,要么全部不执行。下面就是如何使用这些语句的一个简单的 例子:

BEGIN TRANSACTION

INSERT credit_cards (username,ccnumber)

VALUES(‘Andrew Jones’,’5555-55-555-55-5555’)

INSERT orders(username) VALUES (‘Andrew Jones’)

COMMIT TRANSACTION

在 该例子中,我们使用BEGIN TRANSACTION 和COMMIT TRANSACTION来定义事务块.在该块中显示的语句只有在执行COMMIT TRANSACTION后才发生效用。假如在到达该语句之前的任一点发生了错误,所有在该事务中的语句都不会发生效用。比如在上面的例子中,如果你的硬盘 在执行完第一个INSERT语句而在第二个语句之前发生了硬盘错误。没有数据会插入到任一表中。第一个语句会倒转回去,并不会有如何效果。

你可以使用ROLLBACK TRANSACTION语句来显式地倒转一个事务,如下所示:

BEGIN TRANSACTION

INSERT credit_cards(username,ccnumber)

VALUES(‘Andrew Jones’,’5555-55-555-55-5555’)

INSERT orders(username) VALUES(‘Andrew Jones)

IF DATENAME(dw,GETDATE())=”Tuesday”

ROLLBACK TRANSACTION

ELSE

COMMIT TRANSACTION

在上面的例子中,事务在除了星期二外的每天都递发。假如一个星期中的某一天刚好是星期二,则事务就会倒转回去,不会产生任何效果。换句话说,在在星期二不会收到任何新的定单。

注意

在和触发器一起使用时,ROLLBACK TRANSACTION命令特别有用。参看下面的“结合触发器和事务过程”部分。

你可能感兴趣的:(Transact SQL教程(三))