• sql server 流程控制


    CASE...WHEN...

    简单表达式:

    select top 4 
        case ZhiYeID
        when 1 then '老板'
        when 2 then '经理'
        when 3 then '搬砖'
        else '打杂'
        end as '职位',ZhiYeID
        from  ZhiWei order by ZhiYeID
    

    每个ZhiYeID都与每个when逐行匹配后面的值比较,匹配则取该when后then的值,否则取下一行when后面的值,都不匹配则取else后面的值。

    因为CASE简单表达式的值只局限在一列(字段field)当中,所以THEN后面的值数据类型必须相同,或者兼容,否则就会报错。

    CASE搜索表达式把字段名写在when后面

    CASE搜索表达式提供了更强大的功能,CASE搜索表达式不仅可以使用更复杂的逻辑表达式,并且还能根据多列中的数据确定所显示列的值。

    公司员工病假休假不得超过30小时,取得所有男性员工的ID,如果员工病假或者是休假任意一项超过了30个小时,标记为"超出假期",两项都不超过30个小时的,标记为"还可请假"
    SELECT EmployeeID,
          CASE 
          WHEN VacationHours>30 AND Gender='M' THEN '超出假期'
          WHEN SickLeaveHours>30 AND Gender='M' THEN '超出假期'
          ELSE '还可请假'
          END AS "请假情况"
      FROM [AdventureWorks].[HumanResources].[Employee]
    

    因为CASE表达式是基于列的,一个CASE表达式只能返回一个值,所以基于多少个值排序,则需要多少个CASE表达式

    比如:我想查看省份ID为8和9的员工的地址,当省份ID为9时,按照AddressID降序排列,当省份ID为8时,按照AddressID升序排列
    
    SELECT [AddressID]
          ,[AddressLine1]
          ,[City]
          ,[StateProvinceID]
          FROM [AdventureWorks].[Person].[Address]
    WHERE StateProvinceID=9 OR StateProvinceID=8
    ORDER BY  
             CASE WHEN StateProvinceID=9 THEN AddressID END DESC,
             CASE WHEN StateProvinceID=8 THEN AddressID END
    

    流程控制

    流程控制语句(if else)只能在单个批处理段(Batch),用户自定义函数和存储过程中使用。不能跨多个批处理段或者用户自定义函数和存储过程。

    一个批处理段是由一个或者多个语句组成的一个批处理,之所以叫批处理是因为所有语句一次性被提交到一个SQL实例。在这个批处理范围内,局部变量是互相可见的。

    而想让多个语句分多次提交到SQL实例,则需要使用GO关键字。GO关键字本身并不是一个SQL语句,GO关键字可以看作是一个批处理结束的标识符,当遇到GO关键字时,当前GO之前的语句会作为一个批处理直接传到SQL实例执行。所以不在同一个批处理内局部变量不可见,也不可对跨批处理的语句使用流程控制语句.

    被中断的批处理
    DECLARE @a int
    select @a=2
    go
    if @a=2
    	select 2
    	else select 0
    

    在T-SQL中,与流程控制语句相关的关键字有8个:

    BEGIN...END BREAK
    GOTO CONTINUE
    IF...ELSE WHILE
    RETURN WAITFOR

    BEGIN…END关键字

    BEGIN…END关键字也是流程控制语句需要用到的最基本关键字,用于将多个语句划分成逻辑上的一部分。其实可以直接理解成类C语言中的花括号(“{}"“)

    WHILE/BREAK/CONTINUE关键字

    在T-SQL的流程控制语句中,循环语句只有WHILE循环,并没有传统高级语言的FOR和SWITCH循环。WHILE除了被用于流程控制语句的循环之外,还经常被用于游标之中。

    WHILE关键字和高级语言中的WHILE关键字几乎完全一样。WHILE循环中可以利用BREAK和CONTINUE关键字对循环进行控制。

    CONTINUE关键字用于结束本次循环,直接开始下一次循环。

    BREAK关键字用于直接跳出WHILE循环语句。

    这里值得注意的是,当WHILE循环嵌套时,CONTINUE关键字和BREAK关键字只会作用于它们所处的WHILE循环之内,不会对外部WHILE循环产生作用。

    IF..ELSE关键字

    IF..ELSE关键字实现了非此既彼的逻辑。和高级语言中的IF..ELSE具有完全一样的使用方法。
    if或else后面的语句较多最好用begin end包起来。

    要注意的是IF经常会和EXISTS关键字相结合来查看数据表中指定的数据是否存在。

    GOTO关键字

    GOTO关键字因为能打乱程序的整个流程而在高级语言中臭名卓著。GOTO关键字的使用非常简单,定义一个跳转标签,只要GOTO 标签名就可以。如果说一定要使用GOTO关键字的话,最佳实践是只使用在错误处理上,比如:

    if (@@error<>0)
        goto error
    error:select 'ERROR DESCRIPTION'
    

    RETURN关键字

    Return是最简单有效直接无条件告诉服务器跳出某个批处理段(Batch),用户自定义函数和存储过程的方式。

    begin 
    select '123'
    RETURN 
    select '234'
    END
    
    报错并继续执行
    begin 
    print '123'
    RAISERROR ('报错了!',2,1)
    print '234'
    END
    

    WAITFOR关键字允许指定语句在特定时间或是推迟特定时间执行。

    推迟等待和在特定时间执行的语法分别是WAITFOR DELAY :需要延时的时间(00:00:03(时分秒)),WAITFOR TIME :需要执行程序的精确时间。

    waitfor只执行一次,触发器可执行多次

    10小时候搞优惠活动,1000的货物价格调为900,20小时后调回原价1000:
    declare @starttime Datetime @endtime Datetime
    set @starttime=cast(getdate()+'10:00:00' as datetime)
    set @endtime=cast(getdate()+'20:00:00' as datetime)
    waitfor time @starttime
    begin
    update huoWu set jiaGe=900 where jiaGe=1000
    end
    waitfor time @endtime
    begin
    update huoWu set jiaGe=1000 where jiaGe=900
    end
    
  • 相关阅读:
    牛客练习赛64 D.宝石装箱 【容斥原理+背包DP】
    洛谷 P5212 SubString【SAM+LCT】
    洛谷 P4219 [BJOI2014]大融合【LCT】
    洛谷 P1501 [国家集训队]Tree II【LCT】
    洛谷 P5357 【模板】AC自动机(二次加强版)
    洛谷 P3690 【模板】Link Cut Tree (动态树)
    洛谷 P2463 [SDOI2008]Sandy的卡片【后缀数组】
    P3181 [HAOI2016]找相同字符【后缀数组】
    洛谷 SP705 【后缀数组】
    牛客小白月赛18 E.Forsaken的数列【Splay】
  • 原文地址:https://www.cnblogs.com/Neroi/p/13900802.html
Copyright © 2020-2023  润新知