使用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语句格式。假如你需要把一个值和多个值比较时，则使用第二种格式。