if condition then
...一系列可执行语句....
end if;
其中,condition是一个布尔类型的变量、常量,或者求值结果为true、false或者null的表达式。condition结果为true,则位于关键字then 后面、配对end if语句之前的可执行语句就会执行。如果condition的结果为false或者null,这些语句不会执行。
例子:
create or replace function doctor_test() returns integer AS $$ declare begin if 1 = 1 then return 1; end if; return 0; end; $$language plpgsql immutable ; select doctor_test();
结果:1.
create or replace function doctor_test() returns integer AS $$ declare begin if 2 = 1 then return 1; end if; return 0; end; $$language plpgsql immutable ; select doctor_test();
结果:0
-- Function: doctor_test() -- DROP FUNCTION doctor_test(); create or replace function doctor_test() returns integer AS $$ declare begin if null is null then return 1; end if; return 0; end; $$language plpgsql immutable ; select doctor_test();
结果:1.
-- Function: doctor_test() -- DROP FUNCTION doctor_test(); create or replace function doctor_test() returns integer AS $$ declare begin if 1=1 or null then return 1; end if; return 0; end; $$language plpgsql immutable ; select doctor_test();
结果:1
-- Function: doctor_test() -- DROP FUNCTION doctor_test(); create or replace function doctor_test() returns integer AS $$ declare begin if 1=1 and null then return 1; end if; return 0; end; $$language plpgsql immutable ; select doctor_test();
结果:0
注:有时候,我们无法知道表达式中的每一个值。这是因为数据库允许null值或者值缺失。如果一个表达式包含null值,那么表达式的结果又会是什么?
对每个布尔值表达式中的每个变量 ,你一定要仔细考虑变量是null带来的后果。同时还要考虑短路现象。
例如:
-- Function: doctor_test() -- DROP FUNCTION doctor_test(); create or replace function doctor_test() returns integer AS $$ declare begin if 2=1 then return 1; else return 2; end if; end; $$language plpgsql immutable ; select doctor_test();
结果:2
例如:简单case语句:
-- Function: doctor_test() -- DROP FUNCTION doctor_test(); create or replace function doctor_test() returns integer AS $$ declare i int; begin i := 8; case i when 1 then return 1; when 2 then return 2; else return -1; end case; end; $$language plpgsql immutable ; select doctor_test();
结果:-1
-- Function: doctor_test() -- DROP FUNCTION doctor_test(); create or replace function doctor_test() returns integer AS $$ declare begin case true when 1=1 then return 1; when 2 > 1 then return 2; else return -1; end case; end; $$language plpgsql immutable ; select doctor_test();
结果:1
例如:搜索型case语句:
-- Function: doctor_test() -- DROP FUNCTION doctor_test(); create or replace function doctor_test() returns integer AS $$ declare begin case when 1=1 then return 1; when 2 > 1 then return 2; else return -1; end case; end; $$language plpgsql immutable ; select doctor_test();
结果:1
注意:和简单case语句一样,
(1)一旦某些语句被执行,整个执行也就结束了。即便有多个表达式求值结果都是true,也只有和第一个表达式关联的语句被执行。
(2)else语句是可选的。如果没指定else,并且没有一个表达式的结果是true,就会出现异常错误:
如:
错误: 没有找到CASE
提示: 在CASE语句结构中丢失ELSE部分
背景: 在CASE的第7行的PL/pgSQL函数doctor_test()
********** 错误 **********
错误: 没有找到CASE
SQL 状态: 20000
指导建议:在CASE语句结构中丢失ELSE部分
上下文:在CASE的第7行的PL/pgSQL函数doctor_test()
(3)when 表达式是按照从上到下的顺序被依次求值。