基于postgresl的gaussDB(DWS)地址省市区解析函数

地址格式为: 省(自治区,直辖市)、市、区。

直辖市的地址格式为, 北京市北京市海淀区xxxxx。 若是北京市海淀区xxx,自己改改就可以了

采用的是笨办法,穷举。

涉及的两个主要内置函数。

1. instr( ,'str1' , 'str2' , ) 。

查找str2在str1出现的位置。num是出现的次数,默认是1。例如num=2,就是str2在str1第二次出现的位置。start_position是起始的位置下标,默认是从头开始即 1。

若str2在str1找不到,则返回0

instr('123456', '2')  -- 结果是: 2. 位置索引值是从1开始

instr('123456', '2' , 2) -- 结果是0 , 因为2 只出现一次 

instr('新疆维吾尔族自治区','自治区') -- 结果是7 

2. substr(str1, start_position, )

截取字符串, 从str1 的 start_position开始截取, 截取长度是 length。length不填就是截取到字符串的最右边。

例如 start_position=2, length=3,  str1= ‘’12345678‘’

substr('123456', 2, 3) -- 结果是: 234. 因为postgres是下标索引是1开始

substr('123456', 1, 3) -- 结果是: 123. 因为postgres是下标索引是1开始
substr('123456', 0, 3) -- 结果是: 123. 0也当成1

substr('123456', 2) -- 结果是: 23456.  长度值不填,默认就是截取到最右边

substr('新疆维吾尔族自治区',1 ,instr('新疆维吾尔族自治区','自治区'))
-- substr('新疆维吾尔族自治区',1 , 7)
-- '新疆维吾尔族自'

substr('新疆维吾尔族自治区',1 ,instr('新疆维吾尔族自治区','自治区')+2)
-- substr('新疆维吾尔族自治区',1 , 7+2)
-- '新疆维吾尔族自治区'

3. 省市区解析函数


CREATE OR REPLACE FUNCTION dm.f_get_province(i_address character varying(500))
 RETURNS character varying
 LANGUAGE plpgsql
 STABLE NOT FENCED SHIPPABLE  -- DWS特有的,如果你是postgres就不用
AS $$
DECLARE
  p_province VARCHAR2(500);
  text_var1 text;
  text_var2 text;
  text_var3 text;
BEGIN

  SELECT 
	  CASE WHEN instr(i_address,'省') >0 THEN substr(i_address,1,instr(i_address,'省'))
		   WHEN instr(i_address,'自治区') >0 THEN substr(i_address,1,instr(i_address,'自治区')+2)
		   WHEN instr(i_address,'特别行政区') >0 THEN substr(i_address,1,instr(i_address,'特别行政区')+4)
		   WHEN instr(i_address,'北京市') > 0 then substr(i_address,1, instr(i_address, '北京市')+2)
		   WHEN instr(i_address,'天津市') > 0 then substr(i_address,1, instr(i_address, '天津市')+2)
		   WHEN instr(i_address,'上海市') > 0 then substr(i_address,1, instr(i_address, '上海市')+2)
		   WHEN instr(i_address,'重庆市') > 0 then substr(i_address,1, instr(i_address, '重庆市')+2)
	  ELSE i_address
	  END PROVINCE INTO p_province ;
   
  RETURN (p_province) ;
  EXCEPTION
     WHEN others THEN
     
	   GET STACKED DIAGNOSTICS text_var1 = RETURNED_SQLSTATE  ,
                               text_var2 = MESSAGE_TEXT  ,
                               text_var3 = PG_EXCEPTION_DETAIL;
	   RAISE NOTICE E'--- [ 已处理的异常代码_RETURNED_SQLSTATE ] : %', text_var1;    -- 记录异常信息
	   RAISE NOTICE E'--- [ 已处理的异常简要信息_MESSAGE_TEXT ] : %', text_var2;
	   RAISE NOTICE E'--- [ 已处理的异常详细信息_PG_EXCEPTION_DETAIL ] : %', text_var3;
       
	   RETURN ('') ;   -- 地址异常, 返回空 -- 解析异常, 直接返回空字符串
END $$
;

-------  获取城市  ,  直辖市,地级市,地区、自治州、盟

CREATE OR REPLACE FUNCTION dm.f_get_city(i_address character varying(500))
 RETURNS character varying
 LANGUAGE plpgsql
 STABLE NOT FENCED SHIPPABLE
AS $$
DECLARE
  p_city VARCHAR2(500);
  text_var1 text;
  text_var2 text;
  text_var3 text;
BEGIN
                                     
  SELECT                
	  CASE  WHEN instr(i_address,'特别行政区') >0 THEN  case  when instr(i_address,'香港特别行政区') > 0 THEN '香港特别行政区'
	                                                         when instr(i_address,'澳门特别行政区') > 0 THEN '澳门特别行政区'
														     else i_address
												       end
					   
		   WHEN instr(i_address,'北京市') > 0 then '北京市'									
		   WHEN instr(i_address,'天津市') > 0 then '天津市'
           WHEN instr(i_address,'上海市') > 0 then '上海市'	 		   
		   WHEN instr(i_address,'重庆市') > 0 then '重庆市'
		   
		   -- 盟是内蒙古特有, 地区则是 西藏和新疆									   
		   WHEN instr(i_address,'自治区') > 0 THEN case  when instr(i_address,'自治州') > 0 THEN substr(i_address, instr(i_address,'自治区') + 3, instr(i_address,'自治州')+3 - (instr(i_address,'自治区')+3))
		                                                 -- 确保是 盟名,而不是,镇,乡村,街道的名字,  即自治区和盟之间 没有其他 地级市级行政区的 名字, 市,地区
														 when instr(i_address,'盟') > 0
														  and instr(substr(i_address, instr(i_address,'自治区')+3,instr(i_address,'盟')+1 - (instr(i_address,'自治区')+3)),'市') = 0  
													      and instr(substr(i_address, instr(i_address,'自治区')+3,instr(i_address,'盟')+1 - (instr(i_address,'自治区')+3)),'地区') = 0 THEN substr(i_address, instr(i_address,'自治区') + 3, instr(i_address,'盟')+1 - (instr(i_address,'自治区')+3))
	                                                     -- 确保是 地区名,而不是,镇,乡村,街道的名字,  即自治区和地区之间 没有其他 地级市级行政区的 名字, 市,盟
														 when instr(i_address,'地区') > 0
														  and instr(substr(i_address, instr(i_address,'自治区')+3,instr(i_address,'地区')+2 - (instr(i_address,'自治区')+3)),'市') = 0  
													      and instr(substr(i_address, instr(i_address,'自治区')+3,instr(i_address,'地区')+2 - (instr(i_address,'自治区')+3)),'盟') = 0 THEN substr(i_address, instr(i_address,'自治区') + 3, instr(i_address,'地区')+2 - (instr(i_address,'自治区')+3))
	                                                    -- 确保是 地级市名,而不是,镇,乡村,街道的名字,  即自治区和市 之间 没有其他 地级市级行政区的 名字, 地区,盟
														 when instr(i_address,'市') > 0
														  and instr(substr(i_address, instr(i_address,'自治区')+3,instr(i_address,'市')+1 - (instr(i_address,'自治区')+3)),'地区') = 0  
													      and instr(substr(i_address, instr(i_address,'自治区')+3,instr(i_address,'市')+1 - (instr(i_address,'自治区')+3)),'盟') = 0 THEN substr(i_address,instr(i_address,'自治区') + 3, instr(i_address,'市')+1 - (instr(i_address,'自治区')+3))
												         else i_address
												  end
												  
	       WHEN instr(i_address,'省') > 0 THEN case when instr(i_address,'自治州') > 0 THEN substr(i_address,instr(i_address,'省') + 1, instr(i_address,'自治州')+3 - (instr(i_address,'省')+1))
	                                               -- 确保是 地区名,而不是,镇,乡村,街道的名字,  即省和地区之间 没有其他 地级市级行政区的 名字, 市
												   -- 地区 只有黑龙江省有
												   when instr(i_address,'地区') > 0 and instr(i_address,'省') > 0
												    and instr(substr(i_address, instr(i_address,'省')+1,instr(i_address,'地区')+2 - (instr(i_address,'省')+1)),'市') = 0 THEN substr(i_address,instr(i_address,'省') + 1, instr(i_address,'地区')+2 - (instr(i_address,'省')+1))            
												   -- 确保是 市名,而不是,镇,乡村,街道的名字,  即省和地区之间 没有其他 地区级行政区的 名字, 地区
												   when instr(i_address,'市') > 0 
												    and instr(substr(i_address, instr(i_address,'省')+1,instr(i_address,'市')+1 - (instr(i_address,'省')+1)),'地区') = 0 THEN substr(i_address,instr(i_address,'省') + 1, instr(i_address,'市')+1 - (instr(i_address,'省')+1))
												   else i_address
											  end
 
	  ELSE i_address
	  END city INTO p_city ;
   
  RETURN (p_city) ;
  EXCEPTION
     WHEN others THEN
     
	   GET STACKED DIAGNOSTICS text_var1 = RETURNED_SQLSTATE  ,
                               text_var2 = MESSAGE_TEXT  ,
                               text_var3 = PG_EXCEPTION_DETAIL;
	   RAISE NOTICE E'--- [ 已处理的异常代码_RETURNED_SQLSTATE ] : %', text_var1;    -- 记录异常信息
	   RAISE NOTICE E'--- [ 已处理的异常简要信息_MESSAGE_TEXT ] : %', text_var2;
	   RAISE NOTICE E'--- [ 已处理的异常详细信息_PG_EXCEPTION_DETAIL ] : %', text_var3;
       
	   RETURN ('') ;   -- 地址异常, 返回空
END $$
;

-------  获取县级  , 市辖区、县级市、县、自治县、旗、自治旗、特区、林区
-------  上级行政     直辖市,地级市,地区、自治州、盟

CREATE OR REPLACE FUNCTION dm.f_get_county(i_address character varying(500))
 RETURNS character varying
 LANGUAGE plpgsql
 STABLE NOT FENCED SHIPPABLE
AS $$
DECLARE
  p_county VARCHAR2(500);
  text_var1 text;
  text_var2 text;
  text_var3 text;
BEGIN
                                     
  SELECT 
	  CASE WHEN instr(i_address,'神农架林区') > 0 THEN  '神农架林区' 
	       WHEN instr(i_address,'六枝特区') > 0 THEN  '六枝特区'
		   
		   -- 如果是 北京市北京市xx区的格式	
		   WHEN instr(i_address,'北京市',1,2) > 0 then case when instr(i_address,'区') > 0 THEN substr(i_address,instr(i_address,'北京市',1,2) + 3, instr(i_address,'区') + 1 - (instr(i_address,'北京市',1,2) + 3))   
														else i_address	
												    end		 
		   -- 如果是 北京市xx区的格式										
           WHEN instr(i_address,'北京市') > 0 then case when instr(i_address,'区') > 0 THEN substr(i_address,instr(i_address,'北京市') + 3, instr(i_address,'区') + 1 - (instr(i_address,'北京市') + 3))             
														else i_address	
													end													
												
													
		   WHEN instr(i_address,'天津市',1,2) > 0 then case when instr(i_address,'区') > 0 THEN substr(i_address,instr(i_address,'天津市',1,2) + 3, instr(i_address,'区') + 1 - (instr(i_address,'天津市',1,2) + 3))   
														else i_address	
												    end		
		   WHEN instr(i_address,'天津市') > 0 then case when instr(i_address,'区') > 0 THEN substr(i_address,instr(i_address,'天津市') + 3, instr(i_address,'区') + 1 - (instr(i_address,'天津市') + 3))             
														else i_address	
                                                    end
																							
													
		   WHEN instr(i_address,'上海市',1,2) > 0 then case when instr(i_address,'区') > 0 THEN substr(i_address,instr(i_address,'上海市',1,2) + 3, instr(i_address,'区') + 1 - (instr(i_address,'上海市',1,2) + 3))   
														else i_address	
												    end	
           WHEN instr(i_address,'上海市') > 0 then case when instr(i_address,'区') > 0 THEN substr(i_address,instr(i_address,'上海市') + 3, instr(i_address,'区') + 1 - (instr(i_address,'上海市') + 3))             
														else i_address	
													end													
													
		   WHEN instr(i_address,'香港特别行政区') > 0 then case when instr(i_address,'区',1,2) > 0 THEN substr(i_address,instr(i_address,'香港特别行政区',1,2) + 7, instr(i_address,'区',1,2) + 1 - (instr(i_address,'香港特别行政区',1,2) + 7))   
														else i_address	
												    end		
													
		   WHEN instr(i_address,'澳门特别行政区') > 0 then case when instr(i_address,'区',1,2) > 0 THEN substr(i_address,instr(i_address,'澳门特别行政区',1,2) + 7, instr(i_address,'区',1,2) + 1 - (instr(i_address,'澳门特别行政区',1,2) + 7))   
														else i_address	
												    end	
														
		   WHEN instr(i_address,'重庆市',1,2) > 0 then case when instr(i_address,'自治县') > 0 THEN substr(i_address,instr(i_address,'重庆市',1,2) + 3, instr(i_address,'自治县') + 3 - (instr(i_address,'重庆市',1,2) + 3))		                                                											      
												        -- 确保是县级县名,而不是,镇,乡村,街道的名字, 即确保市和县之间 没有其他县级行政区的 名字, 区
													    when instr(i_address,'县') > 0
													    and  instr(substr(i_address, instr(i_address,'重庆市',1,2)+3,instr(i_address,'县')+1 - (instr(i_address,'重庆市',1,2)+3)),'区') = 0 THEN substr(i_address,instr(i_address,'重庆市',1,2) + 3, instr(i_address,'县') + 1 - (instr(i_address,'重庆市',1,2) + 3))
														-- 确保是县级区名,而不是,镇,乡村,街道的名字, 即确保市和区之间 没有其他县级行政区的 名字, 县
														when instr(i_address,'区') > 0 
														 and instr(substr(i_address, instr(i_address,'重庆市',1,2)+3,instr(i_address,'区')+1 - (instr(i_address,'重庆市',1,2)+3)),'县') = 0 THEN substr(i_address,instr(i_address,'重庆市',1,2) + 3, instr(i_address,'区') + 1 - (instr(i_address,'重庆市',1,2) + 3))             
														else i_address	
												    end
		   WHEN instr(i_address,'重庆市') > 0 then case when instr(i_address,'自治县') > 0 THEN substr(i_address,instr(i_address,'重庆市') + 3, instr(i_address,'自治县') + 3 - (instr(i_address,'重庆市') + 3))		                                                											      
												        -- 确保是县级县名,而不是,镇,乡村,街道的名字, 即确保市和县之间 没有其他县级行政区的 名字, 区
													    when instr(i_address,'县') > 0
													    and  instr(substr(i_address, instr(i_address,'重庆市')+3,instr(i_address,'县')+1 - (instr(i_address,'重庆市')+3)),'区') = 0 THEN substr(i_address,instr(i_address,'重庆市') + 3, instr(i_address,'县') + 1 - (instr(i_address,'重庆市') + 3))
														-- 确保是县级区名,而不是,镇,乡村,街道的名字, 即确保市和区之间 没有其他县级行政区的 名字, 县
														when instr(i_address,'区') > 0 
														 and instr(substr(i_address, instr(i_address,'重庆市')+3,instr(i_address,'区')+1 - (instr(i_address,'重庆市')+3)),'县') = 0 THEN substr(i_address,instr(i_address,'重庆市') + 3, instr(i_address,'区') + 1 - (instr(i_address,'重庆市') + 3))             
														else i_address	
												    end
													
														
           -- 内蒙古自治区 特有	( 目前下辖 旗,县级市,县)	   
		   WHEN instr(i_address,'盟') > 0 and instr(i_address,'内蒙古自治区') > 0 then 
		                                       case  when instr(i_address,'县') > 0
												      -- 确保是 县级县名,而不是,镇,乡村,街道的名字,  即地区和县之间 没有其他县级行政区的 名字, 市,旗
													  and instr(substr(i_address, instr(i_address,'盟')+1,instr(i_address,'县')+1 - (instr(i_address,'盟')+1)),'市') = 0  
													  and instr(substr(i_address, instr(i_address,'盟')+1,instr(i_address,'县')+1 - (instr(i_address,'盟')+1)),'旗') = 0 THEN substr(i_address,instr(i_address,'盟') + 1, instr(i_address,'县')+1 - (instr(i_address,'盟')+1))
													 -- 确保是 县级市名,而不是,镇,乡村,街道的名字,  即地区和县之间 没有其他县级行政区的 名字, 县,旗
													 when instr(i_address,'市') > 0
													  and instr(substr(i_address, instr(i_address,'盟')+1,instr(i_address,'市')+1 - (instr(i_address,'盟')+1)),'县') = 0  
													  and instr(substr(i_address, instr(i_address,'盟')+1,instr(i_address,'市')+1 - (instr(i_address,'盟')+1)),'旗') = 0 THEN substr(i_address,instr(i_address,'盟') + 1, instr(i_address,'市')+1 - (instr(i_address,'盟')+1))
													 -- 确保是 县级旗名,而不是,镇,乡村,街道的名字,  即地区和县之间 没有其他县级行政区的 名字, 县,市
													 when instr(i_address,'旗') > 0
													  and instr(substr(i_address, instr(i_address,'盟')+1,instr(i_address,'市')+1 - (instr(i_address,'盟')+1)),'市') = 0
                                                      and instr(substr(i_address, instr(i_address,'盟')+1,instr(i_address,'市')+1 - (instr(i_address,'盟')+1)),'县') = 0 THEN substr(i_address,instr(i_address,'盟') + 1, instr(i_address,'旗')+1 - (instr(i_address,'盟')+1))									 
												     else i_address
											    end
												
		   -- 黑龙江省和 西藏,新疆自治区  
		   -- 黑龙江省_(下辖 区,县,县级市), 区,县,县级市名 无其他行政等级名
           -- 自治区_(县,县级市,自治县), 县,县级市,自治县 并无其他行政等级名
		   WHEN instr(i_address,'地区') >0 THEN case when instr(i_address,'自治县') > 0 THEN substr(i_address,instr(i_address,'地区') + 2, instr(i_address,'自治县')+3 - (instr(i_address,'地区')+2))
		                                             -- 确保是 县级县名,而不是,镇,乡村,街道的名字,  即地区和县之间 没有其他县级行政区的 名字, 市,区
													 when  instr(i_address,'县') > 0
													   and instr(substr(i_address, instr(i_address,'地区')+2,instr(i_address,'县')+1 - (instr(i_address,'地区')+2)),'市') = 0  
													   and instr(substr(i_address, instr(i_address,'地区')+2,instr(i_address,'县')+1 - (instr(i_address,'地区')+2)),'区') = 0 THEN substr(i_address,instr(i_address,'地区') + 2, instr(i_address,'县')+1 - (instr(i_address,'地区')+2))
													 -- 确保是 县级市名,而不是,镇,乡村,街道的名字,  即地区和县级市之间 没有其他县级行政区的 名字, 县,区
													 when  instr(i_address,'市') > 0 
													   and instr(substr(i_address, instr(i_address,'地区')+2,instr(i_address,'市')+1 - (instr(i_address,'地区')+2)),'县') = 0  
													   and instr(substr(i_address, instr(i_address,'地区')+2,instr(i_address,'市')+1 - (instr(i_address,'地区')+2)),'区') = 0 THEN substr(i_address,instr(i_address,'地区') + 2, instr(i_address,'市')+1 - (instr(i_address,'地区')+2))
	                                                -- 确保是 县级区名,而不是,镇,乡村,街道的名字,  即地区和县级区之间 没有其他县级行政区的 名字, 县,市
   													 when instr(i_address,'区',1,2) > 0 and instr(i_address,'黑龙江省') > 0 
													  and instr(substr(i_address, instr(i_address,'地区')+2,instr(i_address,'区',1,2)+1 - (instr(i_address,'地区')+2)),'县') = 0  
													  and instr(substr(i_address, instr(i_address,'地区')+2,instr(i_address,'区',1,2)+1 - (instr(i_address,'地区')+2)),'市') = 0 THEN substr(i_address,instr(i_address,'地区') + 2, instr(i_address,'区',1,2)+1 - (instr(i_address,'地区')+2))
                                                     else i_address
											    end
		
		   -- 省 和 新疆自治区 (目前下辖,县,自治县,县级市)
	       WHEN instr(i_address,'自治州') > 0 THEN case when instr(i_address,'自治县') > 0 THEN substr(i_address,instr(i_address,'自治州') + 3, instr(i_address,'自治县')+3 - (instr(i_address,'自治州')+3))
	                                                    -- 确保是 县级县名,而不是,镇,乡村,街道的名字,  即地区和县之间 没有其他县级行政区的 名字, 市
													    when instr(i_address,'县') > 0
														 and instr(substr(i_address, instr(i_address,'自治州')+3,instr(i_address,'县')+1 - (instr(i_address,'自治州')+3)),'市') = 0 THEN substr(i_address,instr(i_address,'自治州') + 3, instr(i_address,'县')+1 - (instr(i_address,'自治州')+3))
														-- 确保是 县级市名,而不是,镇,乡村,街道的名字,  即地区和市之间 没有其他县级行政区的 名字, 县
														when instr(i_address,'市') > 0
														 and instr(substr(i_address, instr(i_address,'自治州')+3,instr(i_address,'市')+1 - (instr(i_address,'自治州')+3)),'县') = 0 THEN substr(i_address,instr(i_address,'自治州') + 3, instr(i_address,'市')+1 - (instr(i_address,'自治州')+3)) 
														else i_address
											    end
																					
		   WHEN instr(i_address,'市') > 0  THEN case when instr(i_address,'自治县') > 0 THEN substr(i_address,instr(i_address,'市') + 1, instr(i_address,'自治县')+3 - (instr(i_address,'市')+1))
												     when instr(i_address,'自治旗') > 0 and instr(i_address,'内蒙古自治区') > 0 THEN substr(i_address,instr(i_address,'市') + 1, instr(i_address,'自治旗')+3 - (instr(i_address,'市')+1))
          		                                    -- 确保是县级旗名,而不是,镇,乡村,街道的名字, 即确保市和旗之间 没有其他县级行政区的 名字, 市,县,区
													when instr(i_address,'旗') > 0 and instr(i_address,'内蒙古自治区') > 0 
													and  instr(substr(i_address, instr(i_address,'市')+1,instr(i_address,'旗') - instr(i_address,'市')),'市') = 0 
													and  instr(substr(i_address, instr(i_address,'市')+1,instr(i_address,'旗') - instr(i_address,'市')),'县') = 0 
													and  instr(substr(i_address, instr(i_address,'市')+1,instr(i_address,'旗') - instr(i_address,'市')),'区') = 0 THEN substr(i_address,instr(i_address,'市') + 1, instr(i_address,'旗')+1 - (instr(i_address,'市')+1))    
												    -- 确保是县级县名,而不是,镇,乡村,街道的名字, 即确保市和县之间 没有其他县级行政区的 名字, 市,区 ,旗
													when instr(i_address,'县') > 0 
													 and instr(substr(i_address, instr(i_address,'市')+1,instr(i_address,'县') - instr(i_address,'市')),'市') = 0  
													 and instr(substr(i_address, instr(i_address,'市')+1,instr(i_address,'县') - instr(i_address,'市')),'区') = 0 
													 and instr(substr(i_address, instr(i_address,'市')+1,instr(i_address,'县') - instr(i_address,'市')),'旗') = 0 THEN substr(i_address,instr(i_address,'市') + 1, instr(i_address,'县')+1 - (instr(i_address,'市')+1))
													 
    												when instr(i_address,'辉县市') > 0 THEN '辉县市'
													-- 确保是县级市名,而不是,镇,乡村,街道的名字, 即确保市和市之间 没有其他县级行政区的 名字, 区 ,县 旗
													when instr(i_address,'市',1,2) > 0 
													 and instr(substr(i_address, instr(i_address,'市',1,1)+1,(instr(i_address,'市',1,2)-instr(i_address,'市'))),'区') = 0 
													 and instr(substr(i_address, instr(i_address,'市',1,1)+1,(instr(i_address,'市',1,2)-instr(i_address,'市'))),'县') = 0 
													 and instr(substr(i_address, instr(i_address,'市',1,1)+1,(instr(i_address,'市',1,2)-instr(i_address,'市'))),'旗') = 0 THEN substr(i_address,instr(i_address,'市',1,1) + 1, instr(i_address,'市',1,2)+1 - (instr(i_address,'市',1,1)+1))
	                                                -- 确保是县级区名(自治区),而不是,镇,乡村,街道的名字, 即确保市和区之间 没有其他县级行政区的 名字, 县 旗,市
													when instr(i_address,'自治区') > 0 and instr(i_address,'区',1,2)  > 0 
													 and instr(substr(i_address, instr(i_address,'市')+1,(instr(i_address,'区',1,2)-instr(i_address,'市'))),'市') = 0 
													 and instr(substr(i_address, instr(i_address,'市')+1,(instr(i_address,'区',1,2)-instr(i_address,'市'))),'县') = 0 
													 and instr(substr(i_address, instr(i_address,'市')+1,(instr(i_address,'区',1,2)-instr(i_address,'市'))),'旗') = 0 THEN substr(i_address,instr(i_address,'市') + 1, instr(i_address,'区',1,2)+1 - (instr(i_address,'市')+1))
													-- 确保是县级区名(省),而不是,镇,乡村,街道的名字, 即确保市和区之间 没有其他县级行政区的 名字, 县 旗,市
													when instr(i_address,'省') > 0 and instr(i_address,'区') and instr(i_address,'自治区') = 0
													 and instr(substr(i_address, instr(i_address,'市')+1,(instr(i_address,'区')-instr(i_address,'市'))),'市') = 0 
													 and instr(substr(i_address, instr(i_address,'市')+1,(instr(i_address,'区')-instr(i_address,'市'))),'县') = 0 
													 and instr(substr(i_address, instr(i_address,'市')+1,(instr(i_address,'区')-instr(i_address,'市'))),'旗') = 0 THEN substr(i_address,instr(i_address,'市') + 1, instr(i_address,'区')+1 - (instr(i_address,'市')+1))
												    else i_address
											    end
	  ELSE i_address
	  END county INTO p_county ;
   
  RETURN (p_county) ;
  EXCEPTION
     WHEN others THEN
     
	   GET STACKED DIAGNOSTICS text_var1 = RETURNED_SQLSTATE  ,
                               text_var2 = MESSAGE_TEXT  ,
                               text_var3 = PG_EXCEPTION_DETAIL;
	   RAISE NOTICE E'--- [ 已处理的异常代码_RETURNED_SQLSTATE ] : %', text_var1;    -- 记录异常信息
	   RAISE NOTICE E'--- [ 已处理的异常简要信息_MESSAGE_TEXT ] : %', text_var2;
	   RAISE NOTICE E'--- [ 已处理的异常详细信息_PG_EXCEPTION_DETAIL ] : %', text_var3;
       
	   RETURN ('') ;   -- 地址异常, 返回空
END $$
;

你可能感兴趣的:(存储组件,数据库)