GBase 8s自定义使用find_in_set()函数

从mysql迁移到GBase 8s数据库时,原有find_in_set函数在GBase 8s中不可用,因此需要自己创建相应的函数,可以使用C或者JAVA创建自定义例程,也可以使用存储过程。以下以存储过程方式创建。
该函数实现的功能是:第一个参数pstr在第二个参数pstrlist,以pdel为分隔符(默认为,)中的分隔位置。

文档更新于2023-12-29

DROP FUNCTION IF EXISTS find_in_set(VARCHAR,VARCHAR,varchar);
CREATE FUNCTION find_in_set(pstr varchar(255),pstrlist varchar(255),pdel varchar(10) DEFAULT ',')
RETURNS int WITH (NOT variant);
  define v_curr int;   -- 当前位置
  define v_last int;   -- 下一位置
  define v_num  int;   -- 计数
  define v_tmpstr varchar(255);  -- 临时文本
  ON EXCEPTION
    RETURN NULL;
  END EXCEPTION;
  let v_num = 1;
  let v_curr = 1;
  loop
    let v_last = instr(pstrlist,pdel,1,v_num);
    IF v_last > 0 THEN
      let v_tmpstr = substr(pstrlist,v_curr,(v_last - v_curr));
    ELSE
      let v_tmpstr = substr(pstrlist,v_curr);
    END IF;
    IF pstr = v_tmpstr THEN
      RETURN v_num;
    END IF;
    exit WHEN v_last == 0;
    let v_num = v_num + 1;
    let v_curr = v_last + 1;
  END loop;
  RETURN 0;
END FUNCTION;

示例:

select find_in_set('南大','南大通用,天津南大通用,南大,南大通用北京,广东南大通用') from dual;

得到的结果如下:

|(expression) |
|-------------|
|3            |

标签: gbase 8s, find_in_set

已有 3 条评论

  1. 张
    建议把官网此文章修改一下,内容体加上:
    delimiter $$
    函数体
    $$
    不然在新版GBaseDataStudio或者dbeaver中,直接执行创建函数语句会报错。
    1. 语句为通用的。
      delimiter $$ 这样的写法,一般仅在可视化工具中需要;在dbaccess中是不需要的。
      1. 张
        建议提醒一下,还是有很多人不知道delimiter $$的写法,并且大多数人都是在可视化工具上执行。我搜社区文档有好几个人都是遇到这个问题。

添加新评论