相关文章推荐
俊逸的柠檬  ·  VS ...·  1 月前    · 
有胆有识的牛肉面  ·  Java ...·  2 月前    · 
完美的排球  ·  ConstraintLayout ...·  1 年前    · 
忐忑的口罩  ·  如何将 Chrome ...·  1 年前    · 
热情的签字笔  ·  Spyder5 - OSCHINA - ...·  1 年前    · 

在系统业务开发中我们经常会使用if-else if- else 的语法结构来判定所给定的条件是否满足,而进行两种或多种不同条件的执行结果。今天我们主要来探索一下在postgre数据库中是否也有类似的语法结构来辅助我们处理类似问题。

查阅相关材料发现在数据库中使用 case if 语法即可满足我们的需要,下边我们具体来看看这两种语法的使用。

CASE处理数据

case用于我们直接在sql查询中做简单的逻辑判断。
以空数据处理为列,我们在系统中需要展示某个属性值,数据中对应的属性因数据的完整性或其它原因导致为空,此时若我们未在前台做对应处理,就会导致前台数据展现为空或者前台处理时发生异常。这时我们就可以使用case对sql查询进行优化,赋予默认值,完美解决。

示例如下:
1.直接查询
在这里插入图片描述

2.使用case 处理
在这里插入图片描述
附上代码:

select 
zbmc,
--当jczb_id为0或为null时默认视为1
case when jczb_id =0 or jczb_id is null 
then 1 else jczb_id 
end jczb_id,
xgzb_id,
jgzs_id,
hsxs_id,
ndbz_id,
snjsxj_id,
snjsbbj_id 
from ioc_app.a_user_gdp_hs_mapping where  id=1

函数中if处理复杂业务

在函数中,若要根据场景不同处理复杂的业务逻辑时,使用case难以满足,或则使代码显得过于庞大臃肿。
此时我们可以使用if来代替case进行处理。
示例如下:
业务场景

--业务场景
查询a_user_gdp_hs_mapping表中的jczb_id值和xgzb_id,
如果zbmc是“第一产业”,直接查出jczb_id和xgzb_id,
如果zbmc是“第二产业”,直接查出jczb_id同时hsxs_id作为xgzb_id查出
其它情况就把ndbz_id作为jczb_id,把hsxs_id作为xgzb_id

1.使用case进行处理

CREATE OR REPLACE FUNCTION "ioc_admin"."fun_spzb_zdhy_a_zb_zdhy_gy_sbqk_jgyd"()
  RETURNS VARCHAR  AS $BODY$
DECLARE
	ret TEXT;
	insert_str TEXT;
	zbmc VARCHAR;
BEGIN
	insert_str='
		select 
			t1.id,
			t1.zbmc,
			--jczb_id值
				when t2.zbmc=''第一产业'' or t2.zbmc=''第二产业''
				then t1.jczb_id 
			 	else t1.ndbz_id 
			end jczb_val,
			--xgzb_id值
				when t2.zbmc=''第一产业''  
				then t1.xgzb_id 
				else t1.hsxs_id 
			end xgzb_val
			select * from ioc_app.a_user_gdp_hs_mapping where  id=1
		) t1,
			select zbmc from ioc_app.a_user_gdp_hs_mapping where  id=1
	execute insert_str ;
	return '执行成功';
end ;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE COST 100

2.使用if进行处理

CREATE OR REPLACE FUNCTION "ioc_admin"."fun_spzb_zdhy_a_zb_zdhy_gy_sbqk_jgyd"()
  RETURNS VARCHAR  AS $BODY$
DECLARE
	ret TEXT;
	insert_str TEXT;
	zbmc VARCHAR;
BEGIN
	execute 'select zbmc from ioc_app.a_user_gdp_hs_mapping where id=1' into zbmc;
	if zbmc ='第一产业'
		insert_str='
			select id,zbmc,jczb_id jczb_val,xgzb_id xgzb_val from ioc_app.a_user_gdp_hs_mapping where  id=1
	elseif zbmc = '第二产业'
		insert_str='
			select id,zbmc,jczb_id jczb_val,hsxs_id xgzb_val from ioc_app.a_user_gdp_hs_mapping where  id=1
		insert_str='
			select id,zbmc,ndbz_id jczb_val,hsxs_id xgzb_val from ioc_app.a_user_gdp_hs_mapping where  id=1
	end if;
	execute insert_str;
	return '执行成功';
end ;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE COST 100
                    POSTGRES 多重if的实战欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如
				
输入案例执行器 input-case-enforcer是一个用于强制执行大写,小写或大写输入和文本区域的插件。 需要DOM库(例如jQuery,Zepto或任何支持扩展$ .fn的库) 纱线,NPM或凉亭 yarn add input-case-enforcer npm install input-case-enforcer bower install input-case-enforcer <!-- Then include the dist files in your HTML --> <link rel="stylesheet" type="text/css" href="input-case-enforcer/dist/input-case-enforcer.min.css" /> <style type="text/javascript" src="input-
//将几张不同表结构的数据全部合并在一起,使用case、union,同时实现小计总计select case when t_all.temp_comm is null then '总计' else t_all.temp_comm end as temp_comm, commodity_name,guige,t_bi_commbaseinfo.comm_type_id,comm_type_name,
一、postgresql中条件表达式 今天上班的时候,有一个哥们跑过来问我,pg有没有行转列的函数,如何实现行转列,他说他pg中没有找到,问我知道不,我想了一下,好像有,不过不像SQLserver 那么好用,但行转列很简单啊,使用多个union all 就简单搞定了啊,于是他给我看了他的问题 select id,a,b,c,d,e,f,g from biztable; 想比较 a,b,c,d,e...
Navicat Premium又一次在看代码的时候,发现了不懂的东西! 这次就是case when then SQL CASE表达式是一种通用的条件表达式,类似于其它语言中的if/else语句。 CASE WHEN condition THEN result [WHEN ...] [ELSE result]
条件判断函数亦称为控制流程函数,根据满足的条件不同,执行相应的流程。PostgreSQL中进行条件判断的函数为CASE。 1.CASE expr WHEN v1 THEN r1 [WHEN v2 THEN r2] [ELSE rn] END 该函数表示,如果expr值等于某个vn,就返回对应位置THEN后面的结果。如果与所有值都不相等,就返回ELSE后面的rn。 select case 2 whe...
postgresql 自定义函数 验证手机号、 验证18位身份证号码 CREATE OR REPLACE FUNCTION “public”.“check_idcard”(“a_sfz” varchar) RETURNS “pg_catalog”.“bool” AS
*** select case when position(‘U1981_6209’ in cdrfile)=1 then replace(cdrfile,cdrfile,‘U1981_6209交换机’) when position(‘U1981_5998’ in cdrfile)=1 then replace(cdrfile,cdrfile,‘U1981_5998交换机’) when posit...
将switch-case语句改成if-else语句的一般步骤如下: 1. 检查switch语句中是否有default情况,有的话需要将其转换成if-else语句中的else部分。 2. 根据每个case的值,将其转换成if-else语句中的if部分。 3. 将每个case块中的语句转移到相应的if块中。 下面是一个简单的示例,将switch-case语句转换为if-else语句: ```c++ switch (x) { case 1: cout << "x is 1" << endl; break; case 2: cout << "x is 2" << endl; break; default: cout << "x is not 1 or 2" << endl; break; 转换成if-else语句: ```c++ if (x == 1) { cout << "x is 1" << endl; } else if (x == 2) { cout << "x is 2" << endl; } else { cout << "x is not 1 or 2" << endl; 注意,if-else语句的执行顺序是从上到下的,而switch-case语句中的执行顺序是根据case的值来决定的。因此,在转换时需要确保if-else语句中的条件顺序是正确的。