PostgreSql之pgsql 条件和顺序控制
createorreplacefunctiondoctor_test() returnsintegerAS $$ declare begin if1=1then return1; endif; return0; end; $$languageplpgsqlimmutable; selectdoctor_test(); 结果:1. createorreplacefunctiondoctor_test() returnsintegerAS $$ declare begin if2=1then return1; endif; return0; end; $$languageplpgsqlimmutable; selectdoctor_test(); 结果:0 --Function:doctor_test() --DROPFUNCTIONdoctor_test(); createorreplacefunctiondoctor_test() returnsintegerAS $$ declare begin ifnullisnullthen return1; endif; return0; end; $$languageplpgsqlimmutable; selectdoctor_test(); 结果:1. --Function:doctor_test() --DROPFUNCTIONdoctor_test(); createorreplacefunctiondoctor_test() returnsintegerAS $$ declare begin if1=1ornullthen return1; endif; return0; end; $$languageplpgsqlimmutable; selectdoctor_test(); 结果:1 --Function:doctor_test() --DROPFUNCTIONdoctor_test(); createorreplacefunctiondoctor_test() returnsintegerAS $$ declare begin if1=1andnullthen return1; endif; return0; end; $$languageplpgsqlimmutable; selectdoctor_test(); 结果:0 注:有时候,我们无法知道表达式中的每一个值。这是因为数据库允许null值或者值缺失。如果一个表达式包含null值,那么表达式的结果又会是什么? 对每个布尔值表达式中的每个变量 ,你一定要仔细考虑变量是null带来的后果。同时还要考虑短路现象。 2. if -then - else 组合例如: --Function:doctor_test() --DROPFUNCTIONdoctor_test(); createorreplacefunctiondoctor_test() returnsintegerAS $$ declare begin if2=1then return1; else return2; endif; end; $$languageplpgsqlimmutable; selectdoctor_test(); 结果:2 3.case 语句利用case语句可以在多个可能的系列中选择一个语句执行。简单的case语句和java,c,c++中的switch case 功能相似。简单的case语句:通过值来关联一个或者多个pgsql语句。根据表达式的返回值来选择哪一个语句被执行。case 语法中的expression和result元素可以是一个标量,也可以是能够得到标量结果的表达式。搜索形式的case语句:根据一系列布尔条件来确定要执行的pgsql语句系列。那些和第一个求值结果true的条件相关联的语句被执行。例如:简单case语句: --Function:doctor_test() --DROPFUNCTIONdoctor_test(); createorreplacefunctiondoctor_test() returnsintegerAS $$ declare iint; begin i:=8; casei when1then return1; when2then return2; else return-1; endcase; end; $$languageplpgsqlimmutable; selectdoctor_test(); 结果:-1 --Function:doctor_test() --DROPFUNCTIONdoctor_test(); createorreplacefunctiondoctor_test() returnsintegerAS $$ declare begin casetrue when1=1then return1; when2>1then return2; else return-1; endcase; end; $$languageplpgsqlimmutable; selectdoctor_test(); 结果:1 例如:搜索型case语句: --Function:doctor_test() --DROPFUNCTIONdoctor_test(); createorreplacefunctiondoctor_test() returnsintegerAS $$ declare begin case when1=1then return1; when2>1then return2; else return-1; endcase; end; $$languageplpgsqlimmutable; selectdoctor_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 表达式是按照从上到下的顺序被依次求值。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |