GaussDB(DWS)迁移 - MySQL兼容 - find_in_set函数改写

举报
你是猴子请来的救兵吗 发表于 2023/12/26 12:22:32 2023/12/26
【摘要】 提供一种MySQL迁移DWS的find_in_set函数的改写方案

函数介绍

find_in_set函数是MySQL实现集合成员查找的SQL写法,其功能如下
函数原型:FIND_IN_SET(str,strlist)
功能释义:

假如字符串str 在由N 子链组成的字符串列表strlist 中, 则返回值的范围在 1N 之间 。
一个字符串列表就是一个由一些被‘,’符号分开的自链组成的字符串。
如果第一个参数是一个常数字符串,而第二个是type SET列,则 FIND_IN_SET() 函数被优化,使用比特计算。
如果str不在strlist 或strlist 为空字符串,则返回值为 0 。
如任意一个参数为NULL,则返回值为 NULL这个函数在第一个参数包含一个逗号(,)时将无法正常运行。

示例语句:

mysql > SELECT FIND_IN_SET('b','a,b,c,d');
     -> 2
#--结果为2 , 因为b 在strlist集合中放在2的位置 并且起始数是从1开始计算起的!

语句改写

DWS目前(8.3.0)不支持类似功能的函数,但是可以通过plpgsql自定义函数进行改写,实现同样的功能。

CREATE OR REPLACE FUNCTION find_in_set(v_mem text, v_set text)
RETURNS int AS $$
DECLARE
   v_index int = 0;
   v_array text[];
   v_elem text;
BEGIN
   v_array := string_to_array(v_set, ',');
   FOREACH v_elem IN ARRAY v_array
   LOOP
      v_index := v_index+1;
      IF v_elem = v_mem THEN
         RETURN v_index;
      END IF;
   END LOOP;
   RETURN 0;
END;
$$ LANGUAGE plpgsql STRICT;

功能验证

经验证,函数结果集与MySQL保持一致。

--常规输入场景
select find_in_set('2','3,4,5'),find_in_set('2','1,2,3');
 find_in_set | find_in_set
-------------+-------------
           0 |           2
(1 row)
--空串匹配场景
select find_in_set('',',4,5,'),find_in_set('','1,2,,4');
 find_in_set | find_in_set
-------------+-------------
           1 |           3
(1 row)
--输入含null场景
select find_in_set(null,''),find_in_set('',null);
 find_in_set | find_in_set
-------------+-------------
             |
(1 row)

注意:输入空串场景,需考虑兼容模式差异,因ORA兼容模式下会将空串视作NULL。

补充知识

SQL之字符匹配函数LOCATE、POSITION、INSTR、IN、ANY、LIKE、REGEXP

函数形式 匹配内容 返回结果
FIND_IN_SET(str,strlist) 字符串在字符串集合里第一次出现的位置 集合元素索引
LOCATE(substr, str) 字符串在被查询字符串里第一次出现的位置 字符串索引
POSITION(substr in str) 字符串在被查询字符串里第一次出现的位置 字符串索引
INSTR(str, substr) 字符串在被查询字符串里第一次出现的位 字符串索引
str IN (strlist) 字符串在字符串列表里出现 是否出现
str = ANY(strlist) 字符串在字符串数组里出现 是否出现
LIKE %str% 模糊匹配字符 是否匹配
REGEXP_LIKE(str, pattern) 正则表达式的模式匹配 是否匹配
REGEXP_SUBSTR(str, pattern) 正则表达式的模式匹配 目标字符串
REGEXP_MATCHES(str, pattern) 正则表达式的模式匹配 目标字符串数组

想了解GuassDB(DWS)更多信息,欢迎微信搜索“GaussDB DWS”关注微信公众号,和您分享最新最全的PB级数仓黑科技~

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。