GBase 8s
适配迁移
文章

GBase 8s 自定义split_part函数

发表于2019-03-24 16:44:003791次浏览9个评论

该函数的功能:以第二个参数separator_in分隔第一个参数str_in,返回第三个参数field_in指定字段。

drop function if exists split_part2;

create function split_part2( str_in lvarchar(2048), separator_in char(1), field_in int  )
  returning varchar(255) ;

  define str_len int;
  define pos_curr int;
  define count_field   int;
  define pos_char char(1);

  IF field_in <= 0 THEN return null; END IF;

  LET count_field   = 1;
  LET str_len = length(str_in);

  FOR pos_curr = 1 TO str_len
    LET pos_char = substr(str_in,pos_curr,1);
    IF pos_char = separator_in THEN
      LET count_field = count_field + 1;
    END IF;
  END FOR;

  IF field_in > count_field THEN
    return null;
  ELSE
    return SUBSTRING_INDEX(SUBSTRING_INDEX(str_in,separator_in,field_in),separator_in,-1);
  END iF;

end function;   

或者,另一种实现方法

create function split_part( str_in lvarchar(2048), separator_in char(1), field_in int  )
returning varchar(255) ;

define res varchar(255);
define str_len int;
define pos_curr int;
define substr_start int;
define substr_length int;
define pos_char char(1);

IF field_in <= 0 THEN return ; END IF;

LET res = '';
LET substr_start = 0;
LET substr_length = 0;
LET str_len = length(str_in);

FOR pos_curr = 1 TO str_len

   LET pos_char = substr(str_in,pos_curr,1);
   IF pos_char = separator_in THEN
      LET field_in = field_in - 1;
   END IF;

   IF field_in = 1 and substr_start = 0 THEN
      LET substr_start = pos_curr + DECODE(pos_char,separator_in,1,0);
   END IF;

   IF field_in <= 0 THEN
      LET substr_length = pos_curr;
      EXIT FOR; 
   END IF;

END FOR;

IF substr_length = 0 THEN
   LET substr_length = str_len+1;
END IF;

IF substr_start = 0 THEN
   LET substr_start = str_len+1;
END IF;

IF substr_length < substr_start THEN
   LET substr_length = 0;
ELSE
   LET substr_length = substr_length - substr_start;
END IF;

RETURN NVL(substring ( str_in from substr_start for substr_length ),'');

end function;                                                                                                                                                           

示例: 以,分隔'aa,bb,cc,dd',返回第三个字段。

select split_part2('aa,bb,cc,dd',',',3) from dual; 

结果: cc

评论

登录后才可以发表评论
用户头像
GBase用户28017发表于 11个月前
努力学习。天天向上。
枫溪发表于 11个月前
666
枫溪发表于 11个月前
mark
枫溪发表于 11个月前
感谢分享 值得学习
枫溪发表于 11个月前
感谢分享
枫溪发表于 11个月前
666
用户头像
levvel发表于 10个月前
听说评论可以拿积分,我试一下子
用户头像
路路路发表于 10个月前
用户头像
路路路发表于 9个月前
mark