lyd2004888 发表于 2018-10-23 08:39:00

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

  
  CASE语句
  CASE函数可以计算多个条件式,并将其中一个符合条件的结果表达式返回。CASE函数按照使用形式的不同,可以分为简单CASE函数和搜索CASE函数。
  简单CASE 函数将某个表达式与一组简单表达式进行比较以确定结果。
  CASE 搜索函数计算一组布尔表达式以确定结果。
  简单CASE函数:
  简单CASE表达式将一个测试表达式与一组简单表达式进行比较,如果某个简单表达式与测试表达式的值相等,则返回相应结果表达式的值。When子句提供测试值,并将When子句所指定的结果表达式返回。测试表达式与测试值的数据类型应一致。找不到满足条件的则返回NULL值。
  语法:
  CASEinput_expression
  WHENwhen_expression THEN
  result_expression[ ...n ]
  
  END
  或者:
  Case输入表达式
  When表达式1 then 结果表达式
  ...... ...
  When表达式n then 结果表达式
  
  [结果表达式(n+1)]
  end
  CASE搜索函数
  在搜索CASE表达式中,CASE关键字后面不跟任何表达式,在When子句后面跟的都是布尔表达式。
  语法:
  CASE
  WHENBoolean_expression
  THENresult_expression[ ...n ]
  
  END
  或者:
  Case
  When布尔表达式1 then 结果表达式
  ...... ...
  When表达式n then 结果表达式
  
  [结果表达式(n+1)]
  End
  简单case语句和搜索case语句之间的区别:
  简单case 语句只能是when 后面的表达式完全匹配case 后的表达式,相当于=,所以也不能匹配null。
  搜索case 语句可以作为比较条件,那么可以使用like,!=,between..and,= 50 and ListPrice = 250 and ListPrice =1500)then‘中档商品‘
  when(价格>=900)then‘中档商品‘
  when(价格>=100)then‘低档商品‘
  ElSE‘小商品‘
  END
  FROMgoods
  
  print语句:
  它主要用于把消息传递到应用程序的消息处理程序,通常在屏幕上显示.
  语法如下:
  print '任何ASCII文本' | @SQL局部变量 | @@SQL全局变量 | 字符串表达式 ...
  说明:
  print语句向客户端返回一个用户自定义的消息,即显示一个字符串(其最长为255哥字符
  串).SQL局部变量.或SQL全局变量 ...
  如果变量的值不是字符串,需先用数据类型转换函数(convert()函数)将其转换为字符串.表达式的长度可以超过8000个字符,但超过8000个的将不再被显示..
  
  WHILE…CONTINUE…BREAK语句
  在程序中当需要多次重复处理某项工作时,就需使用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 } --
  
  {sql_statement| 语句序列 statement_block } --
  
  语句序列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  USE AdventureWorks;
  GO
  CREATEPROCEDURE checkstate@param varchar(11)
  AS
  IF (SELECT StateProvince
  FROMPerson.vAdditionalContactInfo
  WHEREContactID = @param) = 'WA'
  RETURN1
  ELSE
  RETURN2;
  GO

页: [1]
查看完整版本: 40. SQL -- 批处理及流程控制语句(2)