概要
- 控制流语句可以让SQL编写人员可以更好地控制多个复杂SQL语句的走向。
- 默认情况下,数据库引擎只会从上到下一字不漏地执行整个SQL脚本,但通过添加控制流语句则可以让数据库引擎忽略、选择性执行或者重复某段语句
SQL Server 中的控制流
创建SQL语句块:BEGIN … END
- 通常情况下,数据库引擎会把不同的语句分开进行处理
- BEGIN … END的使用可以让多个SQL语句组合成一个SQL语句块(statement_block),从而方便其他控制流语句进行处理
- 同时,语句块之间也可以进行嵌套
条件表达式:CASE … WHEN
- 与其他控制流语句不同,CASE WHEN 是返回一个表达式值的条件表达式而非语句
有两种语法
- CASE 简单表达式,它通过将 input_expression 与一组 when_expression 进行比较来确定结果
- CASE 搜索表达式,它通过计算一组布尔表达式来确定结果
- 支持 ELSE 参数,为当 WHEN 条件均不满足时的备选表达式值
条件选择执行:IF … ELSE
boolean_expression参数是指返回单个布尔值即True或者False的表达式
- 一般而言,boolean_expression参数是使用比较运算符对两个参数进行比较的表达式,但也可以使用更复杂的IN语句或者EXISTS语句
- 如果boolean_expression参数返回值为True则执行IF部分的后续语句或语句块;ELSE部分可选,当返回值为False时,没有ELSE语句则不执行任何语句,有ELSE语句则执行ELSE部分的后续语句或语句块。
条件循环执行:WHILE
- boolean_expression参数与IF…ELSE语句类似,但WHILE在执行完单次循环部分语句后会再次执行boolean_expression来判断返回值是否为True,如果为True则再次执行循环部分语句,如果为False则跳出循环。
快进到下一次循环:CONTINUE
- 在循环语句中使用CONTINUE语句可以跳过本次循环的后续语句,直接开始下一次循环。
- 在CONTINUE语句前注意修改循环条件,不然容易陷入死循环。
中断循环:BREAK
- 在循环语句中使用CONTINUE语句可以跳过本次循环的后续语句,并中断循环。
- 由于BREAK语句不需要再次判断循环条件,所以不需要关注循环条件。
错误处理:TRY…CATCH
- 生产环境一般要比测试环境复杂的多,有时候我们不确定语句是否会报错,假如报错了我们可能会希望把这部分报错的信息保存下来或者采用别的方法去重新处理语句。
- 这时候就可以用到TRY…CATCH语句。当TRY部分的语句报错时,会停止执行TRY部分的后续语句并开始执行CATCH部分的语句。
- CATCH部分的语句是可选的,意味着可以仅仅把其当做一个用于规避报错的语句,类似于TRY_CONVERT函数。系统变量@@ERROR可以查看最近一次报错的错误编码。
抛出错误:THROW
- 如果想记录报错信息后仍抛出错误终止执行,可以在CATCH部分使用THROW语句
更改执行流位置:GOTO
- GOTO可以让数据库引擎跳到label标签处继续执行下一个语句。
- 不建议使用GOTO,这会导致整个脚本不再是线性执行,容易发生超乎预料的错误
MySQL 中的控制流
语句标签 label: ... END [ LOOP | REPEAT | WHILE ]? label
创建SQL语句块:BEGIN … END
条件表达式:CASE … WHEN
条件选择执行:IF … ELSE
重启循环:ITERATE label
- 可用于
LOOP,REPEAT,WHILE
离开循环: LEAVE label
循环执行:LOOP … END LOOP
条件循环执行:REPEAT … UNTIL … END REPEAT
条件循环执行:WHILE … DO … END WHILE
PostgreSQL 中的控制流
SQLite 中的控制流
- 不支持传统的控制流语句
- Author:白鸟3
- URL:https://blog.kun2peng.top/datasci/sql_flow_control
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
