40. SQL -- 批处理及流程控制语句(2)

 

CASE语句

CASE函数可以计算多个条件式,并将其中一个符合条件的结果表达式返回。CASE函数按照使用形式的不同,可以分为简单CASE函数和搜索CASE函数。

简单CASE 函数将某个表达式与一组简单表达式进行比较以确定结果。

CASE 搜索函数计算一组布尔表达式以确定结果。

简单CASE函数:

简单CASE表达式将一个测试表达式与一组简单表达式进行比较,如果某个简单表达式与测试表达式的值相等,则返回相应结果表达式的值。When子句提供测试值,并将When子句所指定的结果表达式返回。测试表达式与测试值的数据类型应一致。找不到满足条件的则返回NULL值。

语法:

CASEinput_expression

WHENwhen_expression THEN

result_expression[ ...n ]

[ELSE else_result_expression]

END

或者:

Case输入表达式

When表达式1 then 结果表达式

...... ...

When表达式n then 结果表达式

[else]

[结果表达式(n+1)]

end

CASE搜索函数

在搜索CASE表达式中,CASE关键字后面不跟任何表达式,在When子句后面跟的都是布尔表达式。

语法:

CASE

WHENBoolean_expression

THENresult_expression[ ...n ]

[ELSEelse_result_expression]

END

或者:

Case

When布尔表达式1 then 结果表达式

...... ...

When表达式n then 结果表达式

[else]

[结果表达式(n+1)]

End

简单case语句和搜索case语句之间的区别:

简单case 语句只能是when 后面的表达式完全匹配case 后的表达式,相当于=,所以也不能匹配null。

搜索case 语句可以作为比较条件,那么可以使用like,!=,between..and,<,=,is null,is not

null 等,比简单case 语句的使用更加广泛,完全可以替代简单case。

Case 语句中可以使用子查询,但是必须返回一行,不可以是多行!

Case 表达式返回的是一个确定的value,如果没有else,若前面的都不匹配,则返回null。<else 不是必须的,都没有匹配返回null,这与PL/SQL 中的case 语句不同,case语句如果不写else,都没有匹配,则报case_not_found 异常>!

简单case 中的表达式,when 后面的表达式类型应该全部保持一致。

所有的then 后面的return_value 类型要保持一致!

对于简单case 表达式,也就是case 表达式 when…那么when null 总是取不到。也就是case 后面的表达式如果值为null,不会与when null 匹配,只会与else 匹配。关于这点,如果case 后面的表达式有可能为null,如果需要匹配null,那么可以使用decode和searched case。

对于搜索 case 语句来说,有自动类型转换,只要条件成立就可以。如:selectcase when1=‘1‘ then 1 end from dual;--1=‘1‘条件成立!

参数最高限制255 个。包括case exp 中的exp 和else 中的,以及when exp1 value 1 算两个参数。如果语句复杂,超过这个限制,可以考虑使用嵌套case。

DEMO

1 、使用带有简单CASE 函数的 SELECT 语句

在 SELECT 语句中,简单CASE 函数仅检查是否相等,而不进行其他比较。以下

示例使用 CASE 函数更改产品系列类别的显示,以使这些类别更易理解。

USE AdventureWorks;

GO

SELECTProductNumber, Category =

CASEProductLine

WHEN‘R‘ THEN ‘Road‘

WHEN‘M‘ THEN ‘Mountain‘

WHEN‘T‘ THEN ‘Touring‘

WHEN‘S‘ THEN ‘Other sale items‘

ELSE‘Not for sale‘

END,

Name

FROMProduction.Product

ORDERBY ProductNumber;

GO

selectProductNumber,ProductLine,name

fromProduction.Product

whereProductLine <> ‘null‘

andProductNumber = ‘BK-M18B-40‘

返回:

分析:

以上示例用于输出三列分别是ProductNumber、Category、Name

其中Category后跟一个简单CASE函数,用于对比表Production.Product中的ProductLine.

当ProductLine输值为R时,则Category列值返回Road,若值为M,则返回Mountain,若

值为T,则返回Touring,若值为S,则返回Other sale items。

若不匹配以上数值时,则返回 Not for sale。

CASEProductLine

WHEN‘R‘ THEN ‘Road‘

WHEN‘M‘ THEN ‘Mountain‘

WHEN‘T‘ THEN ‘Touring‘

WHEN‘S‘ THEN ‘Other sale items‘

ELSE‘Not for sale‘

END,

2 、使用带有 CASE 搜索函数的 SELECT 语句

在 SELECT 语句中,CASE 搜索函数允许根据比较值在结果集内对值进行替换。

下面的示例根据产品的价格范围将标价显示为文本注释。

USE AdventureWorks;

GO

SELECTProductNumber, Name, ‘Price Range‘ =

CASE

WHENListPrice = 0 THEN ‘Mfg item - not for resale‘

WHENListPrice < 50 THEN ‘Under $50‘

WHENListPrice >= 50 and ListPrice <250 THEN ‘Under $250‘

WHENListPrice >= 250 and ListPrice <1000 THEN ‘Under $1000‘

ELSE‘Over $1000‘

END

FROMProduction.Product

ORDERBY ProductNumber ;

GO

selectProductNumber,listprice,name

fromProduction.Product

whereProductNumber = ‘BB-7421‘

返回结果:

分析:

以上示例用于输出ProductNumber, Name, ‘Price Range‘三列数值

其中‘Price Range‘后跟一个CASE 搜索函数语句,用于对比表Production.Product中的listprice列中的数值进行判断.若listprice=0,则‘Price Range‘返回‘Mfg item - not

forresale‘值;若<50,则返回‘Under $50‘;若>=50 and <250,则返回‘Under $250‘;若>=250 and <1000,则返回‘Under $1000‘;否则剩余的返回‘Over $1000‘.

CASE

WHENListPrice = 0 THEN ‘Mfg item - not for resale‘

WHENListPrice < 50 THEN ‘Under $50‘

WHENListPrice >= 50 and ListPrice <250 THEN ‘Under $250‘

WHENListPrice >= 250 and ListPrice <1000 THEN ‘Under $1000‘

ELSE‘Over $1000‘

END

DEMO3:使用简单CASE函数,根据状态列值用于判断是否尚有库存.

USEMARKET

Select货品名称,供应商,库存量,状态=

CASE 状态

when0 then ‘库存无‘

when1 then ‘库存有‘

END

FROMgoods

DEMO4:使用CASE 搜索函数,根据商品价格判别商品档次

USEMARKET

Select货品名称,供应商,价格评价=

CASE

when(价格>=5000)then‘高档商品‘

when(价格>=1500)then‘中档商品‘

when(价格>=900)then‘中档商品‘

when(价格>=100)then‘低档商品‘

ElSE‘小商品‘

END

FROMgoods

 

print语句:

它主要用于把消息传递到应用程序的消息处理程序,通常在屏幕上显示.

语法如下:

print ‘任何ASCII文本‘ | @SQL局部变量 | @@SQL全局变量 | 字符串表达式 ...

说明:

print语句向客户端返回一个用户自定义的消息,即显示一个字符串(其最长为255哥字符

串).SQL局部变量.或SQL全局变量 ...

如果变量的值不是字符串,需先用数据类型转换函数(convert()函数)将其转换为字符串.表达式的长度可以超过8000个字符,但超过8000个的将不再被显示..

 

WHILECONTINUEBREAK语句

在程序中当需要多次重复处理某项工作时,就需使用WHILE循环语句。WHILE语句通过布尔表达式来设置一个循环条件,当条件为真时,重复执行一个SQL语句或语句块,否则退出循环,继续执行后面语句只要指定的条件为True 时,WHILE 语句就会重复语句或语句块。下面两个 Transact-SQL 语句通常和 WHILE 一起使用:REAK 或 CONTINUE。BREAK 语句退出最内层的 WHILE 循环,CONTINUE 语句则重新开始 WHILE 循环。

例如,如果没有其他行可以处理,程序可能执行 BREAK 语句。例如,如果要继续执行代码,则可以执行 CONTINUE 语句。

如果将 SELECT 语句用作 WHILE 语句的条件,则SELECT 语句必须在括号中

语法:

WHILEBoolean_expression --<条件表达式>

Begin

{sql_statement| statement_block } --<命令行或程序块>

[BREAK ]

{sql_statement| 语句序列 statement_block } --<命令行或程序块>

[CONTINUE ]

语句序列3 --<命令行或程序块>

End

WHILE 命令在设定的条件成立时会重复执行命令行或程序块。

CONTINUE 命令可以让程序跳过CONTINUE 命令之后的语句,回到WHILE 循环的第

一行命令。

BREAK 命令则让程序完全跳出循环,结束WHILE 命令的执行。

WHILE 语句也可以嵌套。

在嵌套循环中,内层循环的BREAK 命令将控制权转移到外一层的循环并继续循环。

DEMO1:在游标中使用 WHILE

下面的示例使用 WHILE 语句控制执行的提取数。

USE AdventureWorks;

GO

DECLAREabc CURSOR FOR

SELECT* FROM Purchasing.ShipMethod;

OPENabc;

FETCHNEXT FROM abc

WHILE(@@FETCH_STATUS = 0)

FETCHNEXT FROM abc;

CLOSEabc;

DEALLOCATEabc;

GO

DEMO2:在嵌套的 IF...ELSE WHILE 中使用 BREAK CONTINUE

在以下示例中,如果产品的平均标价小于 $300,则WHILE 循环将价格乘 2,然后选择最高价格。如果最高价格小于或等于 $500,则WHILE 循环重新开始,并再次将价格乘 2。该循环不断地将价格乘 2,直到最高价格超过$500,然后退出 WHILE 循环,并输出一条消息。

USE AdventureWorks;

GO

WHILE( SELECT AVG(ListPrice)

FROMProduction.Product) < $300

BEGIN

UPDATEProduction.Product

SET ListPrice = ListPrice * 2

SELECTMAX(ListPrice) FROM Production.Product

IF (SELECT MAX(ListPrice) FROM Production.Product) > $500

BREAK

ELSE

CONTINUE

END

PRINT‘Too much for themarket to bear‘;

DEMO3:创建一个数学运算表达式:

DECLARE@x INT, @y INT, @c INT

SELECT@x = 1, @y = 1

WHILE@x < 3

BEGIN

PRINT@x --打印变量x 的值

WHILE@y < 3

BEGIN

SELECT@c = 100*@x+ @y

PRINT@c --打印变量c 的值

SELECT@y = @y + 1

END

SELECT@x = @x + 1

SELECT@y = 1

END

返回结果:

1101 102

2201 202

 

GOTO语句

GOTO语句可以使程序直接跳到指定的标有标识符的位置处继续执行,而位于GOTO语句和标识符之间的程序将不会被执行。GOTO语句和标识符可以用在语句块、批处理和存储过程中,标识符可以为数字与字符的组合,但必须以―:‖结尾。

语法:

GOTOlabel

……

label:

DEMO1:分行打印字符1、2、3、4、5。

DECLARE@x INT

SELECT@x = 1

lab_1:PRINT @x

SELECT@x = @x + 1

WHILE@x < 6

GOTOlab_1

DEMO2:以下示例显示如何将 GOTO 用作分支机制

DECLARE@Counter int;

SET @Counter = 1;

WHILE@Counter < 10

BEGIN

SELECT@Counter

SET @Counter = @Counter + 1

IF @Counter = 4 GOTO Branch_One --Jumps to the first branch.

IF @Counter = 5 GOTO Branch_Two --This will never execute.

END

Branch_One:

SELECT‘Jumping To BranchOne.‘

GOTOBranch_Three; --This will prevent Branch_Two fromexecuting.

Branch_Two:

SELECT‘Jumping To BranchTwo.‘

Branch_Three:

SELECT‘Jumping To BranchThree.‘

返回结果:

DEMO3:利用GOTO语句求出从1加到100的总和

declare@sum int, @count int

select@sum=0, @count=1

label_1:

select@sum=@sum+@count

select@count=@count+1

if @count<=100

gotolabel_1

select@count, @sum

返回:

 

WAITFOR语句

WAITFOR语句用于暂时停止执行SQL语句、语句块或者存储过程等,直到所设定的时间已过或者所设定的时间已到才继续执行。

语法:

WAITFOR{ DELAY ‘time‘ | TIME ‘time‘ }

其中,DELAY用于指定时间间隔,TIME用于指定某一时刻,其数据类型为datetime,在datetime数据中不允许有日期部分,即采用hh:mm:ss‘格式。

DEMO:

1 . 使用WAITFOR TIME

以下示例在晚上 10:20 (22:20) 执行存储过程 sp_update_job

USE msdb;

EXECUTEsp_add_job @job_name = ‘TestJob‘;

BEGIN

WAITFOR TIME‘22:20‘;

EXECUTEsp_update_job @job_name = ‘TestJob‘,

@new_name =‘UpdatedJob‘;

END;

GO

2 、使用WAITFOR DELAY

以下示例在两小时的延迟后执行存储过程。

BEGIN

WAITFOR DELAY‘02:00‘;

EXECUTEsp_helpdb;

END;

GO

3 、等待1 小时2 分零3 秒后才执行SELECT 语句

WAITFOR DELAY01:02:03

SELECT * FROMToys

4 、等到晚上11 点零8 分后才执行SELECT 语句

WAITFOR TIME23:08:00

SELECT * FROMToys

 

RETURN语句

RETURN语句用于无条件地终止一个查询、存储过程或者批处理,此时位于RETURN语句之后的程序将不会被执行,在括号内可指定一个返回值。

语法:

RETURN[ integer_expression ]

其中:参数integer_expression为返回的整型值。存储过程可以给调用过程或应用程序,返回整型值。

DEMO1:从过程返回

以下示例显示如果在执行 findjobs 时没有指定用户名作为参数,则RETURN 将使过程向用户屏幕发送一条消息后退出。如果指定了用户名,则将从相应的系统表中检索此用户在当前数据库创建的所有对象名。

CREATEPROCEDURE findjobs @nm sysname = NULL

AS

IF @nm IS NULL

BEGIN

PRINT‘You must give auser name‘

RETURN

END

ELSE

BEGIN

SELECTo.name, o.id, o.uid

FROMsysobjects o INNER JOIN master..syslogins l

ON o.uid = l.sid

WHEREl.name = @nm

END;

DEMO2:返回状态代码

以下示例将检查指定联系人的 ID 的状态。如果所在的州是 Washington (WA),将返回状态代码1。在其他情况下(StateProvince 的值是 WA 以外的值,或者 ContactID 没有匹配的行),返回状态代码2。

USE AdventureWorks;

GO

CREATEPROCEDURE [email protected] varchar(11)

AS

IF (SELECT StateProvince

FROMPerson.vAdditionalContactInfo

WHEREContactID = @param) = ‘WA‘

RETURN1

ELSE

RETURN2;

GO

时间: 2024-10-21 17:02:09

40. SQL -- 批处理及流程控制语句(2)的相关文章

39. SQL -- 批处理及流程控制语句(1)

批处理及流程控制语句 批处理:(批处理语句,简称批语句): 是一组一起提交给SQL Server执行的SQL语句.当执行批处理语句的时候,SQL Server将批处理语句编译到一个称之为执行计划的可执行单元这有助于节省执行时间! 假如您必须执行10个SQL语句且你正在一个个的发送10个请求并执行它们,这个过程很浪费时间.且他们不能一起被执行!但你可以在一个批处理中执行所有的这10个SQL语句,且执行过程将变得很快,因为所有的SQL语句都一起被发送到SQL Server的服务器! 创建批处理语句:

Oracle之PL/SQL编程_流程控制语句

选择语句 1. if...then 语句 语法: if < condition_expression > then plsql_sentence end if; condition_expression:表示一个条件表达式,其值为 true 时,程序会执行 if 下面的 PL/SQL 语句: 如果其值为 false,则程序会跳过if 下面的语句而 直接执行 end if 后边的语句. plsql_sentence:condition_expression 为 true 时,要执行的语句. 2.

29. SQL -- T-SQL 流程控制语句

T-SQL 流程控制语句 Transact-SQL 语言提供了一些可以用于改变语句执行顺序的命令,称为流程控制语句.流程控制语句允许用户更好地组织存储过程中的语句,方便地实现程序的功能.流程控制语句与常见的程序设计语言类似,主要包含以下几种. T-SQL 的流程控制语句: IF-ELSE BEGIN-END CASE WHILE-CONTINUE-BREAK WAITFOR GOTO RETURN IFELSE 语句: 指定 Transact-SQL 语句的执行条件.如果满足条件,则在 IF 关

[推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆)

原文:[推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆) [推荐]ORACLE PL/SQL编程详解之三: PL/SQL流程控制语句(不给规则,不成方圆) ——通过知识共享树立个人品牌. 继上五篇: [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功) [推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到) [推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼.百战不

PL/SQL之--流程控制语句

一.简介 像编程语言一样,oracle PL/SQL也有自己的流程控制语句.通过流程控制语句,我们可以在PL/SQL中实现一下比较复杂的业务逻辑操作.而无需到程序中去控制,在一定程度上提高了效率,这也是PL/SQL的强大之处.PL/SQL流程控制语句有如下几种: 控制语句: 包括IF 语句.CASE语句 循环语句: 包括LOOP语句, WHILE语句.FOR语句 顺序语句: 包括GOTO语句 二.语句种类 1.控制语句 a.IF语句 语法如下: IF 条件语句 TEHN 执行语句 ELSIF 条

SQL SERVER中的流程控制语句

流程控制语句 是指用来控制程序执行和流程分至点额命令,一般指的是逻辑计算部分的控制. 1.Begin End语句 封装了多个T-SQL语句组合,将他们组成一个单元来处理.一般在条件查询或者循环等控制流程语句中,要查询满足特定条件的操作时会用到.Begin--end可以嵌套使用. 语法如下: begin --<sql语句或程序块> end 例子 begin --<sql语句或程序块> select * from StudentInfo update StudentInfo set m

PL/SQL流程控制语句

PL/SQL流程控制语句介绍PL/SQL的流程控制语句, 包括如下三类:控制语句: IF 语句循环语句: LOOP语句, EXIT语句顺序语句: GOTO语句, NULL语句①if语句 IF <布尔表达式> THEN PL/SQL 和SQL语句; ELSIF< 其它布尔表达式> THEN 其它语句; ELSIF< 其它布尔表达式> THEN 其它语句; ELSE 其它语句; END IF; 例: declare v_emp_name employees.last_nam

MS SQL 流程控制语句

Declare   myCursor   cursor   For     Select   *   from   table1 open   myCursor         Fetch   next   From   myCursor   into   @变量     While   @@FETCH_STATUS   =0     begin           --处理单条记录           Fetch   next   From   myCursor     end Close  

PL/SQL程序设计、流程控制

PL/SQL是 Procedure Language & Structured Query Language 的缩写 PL/SQL是对SQL语言存储过程语言的扩展 PL/SQL程序由三个块组成,即声明部分.执行部分.异常处理部分. 在语句块的声明部分对变量声明,声明一个变量的语法是: variable_name [ constant ] type [ not null ] [:=value]其中: variable_name 为变量名 type 为类型 value 为变量的初值 PL/SQL结构