postgresql function 中的流程控制一(判断)
同其他变成语言一样,plpgsql也遵循流程控制的三要素:顺序,分支,循环
环境需要创建emp表:
create table EMP(EMPNO numeric(4) not null,ENAME varchar(10),JOB varchar(9),MGR numeric(4),HIREDATE date,SAL numeric(7 ),COMM numeric(7 ),DEPTNO numeric(2));insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)values (7369, 'SMITH', 'CLERK', 7902, to_date('1980-12-17', 'YYYY-MM-DD'), 800, null, 20);insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)values (7499, 'ALLEN', 'SALESMAN', 7698, to_date('1981-02-20', 'YYYY-MM-DD'), 1600, 300, 30);insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)values (7521, 'WARD', 'SALESMAN', 7698, to_date('1981-02-22', 'YYYY-MM-DD'), 1250, 500, 30);insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)values (7566, 'JONES', 'MANAGER', 7839, to_date('1981-04-02', 'YYYY-MM-DD'), 2975, null, 20);insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)values (7654, 'MARTIN', 'SALESMAN', 7698, to_date('1981-09-28', 'YYYY-MM-DD'), 1250, 1400, 30);insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)values (7698, 'BLAKE', 'MANAGER', 7839, to_date('1981-05-01', 'YYYY-MM-DD'), 2850, null, 30);insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)values (7782, 'CLARK', 'MANAGER', 7839, to_date('1981-06-09', 'YYYY-MM-DD'), 2450, null, 10);insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)values (7788, 'SCOTT', 'ANALYST', 7566, to_date('1987-04-19', 'YYYY-MM-DD'), 3000, null, 20);insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)values (7839, 'KING', 'PRESIDENT', null, to_date('1981-11-17', 'YYYY-MM-DD'), 5000, null, 10);insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)values (7844, 'TURNER', 'SALESMAN', 7698, to_date('1981-09-08', 'YYYY-MM-DD'), 1500, 0, 30);insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)values (7876, 'ADAMS', 'CLERK', 7788, to_date('1987-05-23', 'YYYY-MM-DD'), 1100, null, 20);insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)values (7900, 'JAMES', 'CLERK', 7698, to_date('1981-12-03', 'YYYY-MM-DD'), 950, null, 30);insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)values (7902, 'FORD', 'ANALYST', 7566,to_date('1981-12-02', 'YYYY-MM-DD'), 3000, null, 20);insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)values (7934, 'MILLER', 'CLERK', 7782, to_date('1982-01-23', 'YYYY-MM-DD'), 1300, null, 10);
条件判断:
常用的有if和case两种语法
if 有三种形式:
if ... then ... end if;if ... then ... else ... end if;if ... then ... else if ... then ... else ... end if;
case 有两种形式:
case ... when ... then ... else ... end case;case when ... then ... else ... end case;
案例:
当员工工资少于1500的提示出多加工资,当员工工资多于1500的时候,提示少加工资
create or replace function incre_sal_fun(emp_name varchar)returns voidas $$declareemp_sal numeric;beginselect sal into emp_sal from emp where ename=emp_name;if emp_sal is null thenraise notice '此员工不是本公司员工';elseif emp_sal < 1500 thenraise notice '此员工应该多涨工资';elseraise notice '此员工应该少涨工资';end if;end;$$ language plpgsql;
表中数据
vastbase=# select * from emp;empno | ename | job | mgr | hiredate | sal | comm | deptno-------+--------+-----------+------+---------------------+------+------+--------7369 | SMITH | CLERK | 7902 | 1980-12-17 00:00:00 | 800 | | 207499 | ALLEN | SALESMAN | 7698 | 1981-02-20 00:00:00 | 1600 | 300 | 307521 | WARD | SALESMAN | 7698 | 1981-02-22 00:00:00 | 1250 | 500 | 307566 | JONES | MANAGER | 7839 | 1981-04-02 00:00:00 | 2975 | | 207654 | MARTIN | SALESMAN | 7698 | 1981-09-28 00:00:00 | 1250 | 1400 | 307698 | BLAKE | MANAGER | 7839 | 1981-05-01 00:00:00 | 2850 | | 307782 | CLARK | MANAGER | 7839 | 1981-06-09 00:00:00 | 2450 | | 107788 | SCOTT | ANALYST | 7566 | 1987-04-19 00:00:00 | 3000 | | 207839 | KING | PRESIDENT | | 1981-11-17 00:00:00 | 5000 | | 107844 | TURNER | SALESMAN | 7698 | 1981-09-08 00:00:00 | 1500 | 0 | 307876 | ADAMS | CLERK | 7788 | 1987-05-23 00:00:00 | 1100 | | 207900 | JAMES | CLERK | 7698 | 1981-12-03 00:00:00 | 950 | | 307902 | FORD | ANALYST | 7566 | 1981-12-02 00:00:00 | 3000 | | 207934 | MILLER | CLERK | 7782 | 1982-01-23 00:00:00 | 1300 | | 10(14 rows)
结果:
vastbase=# select incre_sal_fun('ADAMS');NOTICE: 此员工应该多涨工资CONTEXT: referenced column: incre_sal_funincre_sal_fun---------------(1 row)vastbase=# select incre_sal_fun('SCOTT');NOTICE: 此员工应该少涨工资CONTEXT: referenced column: incre_sal_funincre_sal_fun---------------(1 row)vastbase=# select incre_sal_fun('FORD');NOTICE: 此员工应该少涨工资CONTEXT: referenced column: incre_sal_funincre_sal_fun---------------(1 row)
CASE 条件
传入一个参数,判断这个数是不是1,2。
第一种:
case ... when ... else ... end case;
示例:
create or replace function case_fun(x numeric)returns void as $$declaremsg varchar;begincase x when 1,2 thenmsg:='maybe 1 or 2';elsemsg:=' is not 1 or 2';end case;raise notice 'the num %',msg;end;$$ language plpgsql;
结果:
vastbase=# select case_fun(1);NOTICE: the num maybe 1 or 2CONTEXT: referenced column: case_funcase_fun----------(1 row)vastbase=# select case_fun(3);NOTICE: the num is not 1 or 2CONTEXT: referenced column: case_funcase_fun----------(1 row)
第二种:
case when ... else ... end case;
示例:
create or replace function case_fun1(num numeric)returns void as $$declaremsg varchar;begincase when num in (1,2) then msg :='is 1,2';else msg :='is not in value';end case ;raise notice 'the number %',msg;end;$$ language plpgsql;
结果:
vastbase=# select case_fun1(3);NOTICE: the number is not in valueCONTEXT: referenced column: case_fun1case_fun1-----------(1 row)vastbase=# select case_fun1(2);NOTICE: the number is 1,2CONTEXT: referenced column: case_fun1case_fun1-----------(1 row)
THAT'S ALL
BY CUI PEACE!!!
文章转载自最帅dba工作笔记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




