文档章节

PostgreSql之pgsql 条件和顺序控制

Beaver_
 Beaver_
发布于 2015/05/09 11:28
字数 944
阅读 42
收藏 0
  1. if-then 组合:

    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带来的后果。同时还要考虑短路现象。


2. if -then - else 组合

例如:

-- 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

3.case 语句
    利用case语句可以在多个可能的系列中选择一个语句执行。简单的case语句和java,c,c++中的switch case 功能相似。
  简单的case语句:通过值来关联一个或者多个pgsql语句。根据表达式的返回值来选择哪一个语句被执行。case 语法中的expression和result元素可以是一个标量,也可以是能够得到标量结果的表达式。
 搜索形式的case语句:根据一系列布尔条件来确定要执行的pgsql语句系列。那些和第一个求值结果true的条件相关联的语句被执行。

例如:简单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 表达式是按照从上到下的顺序被依次求值。

© 著作权归作者所有

共有 人打赏支持
Beaver_
粉丝 24
博文 136
码字总数 36878
作品 0
杨浦
程序员
postgresql9.3.9版本部署

安装方式:源码包安装 安装环境:linux—Centos 6.5 下载Postgresql源码包 wget http://ftp.postgresql.org/pub/source/v9.3.9/postgresql-9.3.9.tar.bz2 #地址可更改,需要其他包进 http:/...

Taibai_wu
05/18
0
0
postgresql - 三种安装方式

最近接触了postgresql的安装,和大家分享一下。 一、简 介 PostgreSQL 是一种非常复杂的对象-关系型数据库管理系统(ORDBMS),也是目前功能最强大,特性最丰富和最复杂的自由软件数据库系统...

滕先生
06/27
0
0
centos 6.8安装postgresql9.6.9实战

centos 6.8安装postgresql9.6.9实战 一、安装前准备 系统:centos 6.8 服务器IP:192.168.1.211 修改SELINUX=disabled vi /etc/selinux/config 关闭防火墙或者把5432端口允许开放 /etc/init....

jxzhfei
08/16
0
0
BSD 安装PostgreSQL

安装好之后,是没有5432 端口监听的 一通过更改数据据 postgresql.conf 的 listenaddresses 改成 "*", 另外一个是设置增加 pghba.conf 遠端連線的權限。 用 CREATE USER test WITH PASSWORD...

MtrS
2013/08/03
0
0
Postgresql 数据库控制解析(一)

前面我们通过“探索postgresql数据库(一)”和“探索postgresql数据库(二)”基本了解了postgresql数据库。接下来本文开始介绍下数据库控制(server control)。。 一、手动开启数据库(S...

章郎虫
2013/10/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

谷歌 Fuchsia 上手体验,将取代Android/win10

在手机市场领域,Google表现很抢眼,毫无疑问,Android 至今在移动操作系统的市场份额占据绝对领先地位,但是 Android 仍然存在不少问题,碎片化问题严重,在平板以及大屏幕设备上表现糟糕,...

linux-tao
18分钟前
1
0
List、Array与ArrayList

数组在内存中是连续存储的,所以它的索引速度很快,而且赋值和修改元素也非常快,比如: string[] s=new string[3];//赋值 s[0]="a"; s[1]="b"; s[2]="c";//修改 s[1]="b1"; 但是数组...

shimmerkaiye
21分钟前
0
0
Linux 的Lnmp环境下为mysql添加环境变量

一.问题 在Linux 安装完Lnmp 环境后 , 连接Mysql 告诉没有这条命令 mysql -uroot -p 命令失效 因为是源码安装的,所以会出现这样的的原因 。集成环境是不会出现的。 其实很简单,只需要给m...

15834278076
23分钟前
3
0
apolloxlua include函数

include函数不是单独使用的函数, 他并不是标准库的一部分, 你可以使用include函数将某个后缀为 .aop的文档包含到你的文档流中。 因为include是单独处理流, 所以不会在主处理流程中有所表示...

钟元OSS
26分钟前
0
0
【转载分享】做一名较真的工程师

近些年与我共事过的同事,一定知道我至今仍有一个较真的性格。我会:指出同事所写代码的不当命名问题(并帮助改进);指出同事所写文档中的逻辑混乱问题(并辅以修订);指出同事所写PPT中乱...

HellerZhang
28分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部