GaussDB(DWS)迁移 - MySQL兼容 - find_in_set函数改写
【摘要】 提供一种MySQL迁移DWS的find_in_set函数的改写方案
函数介绍
find_in_set函数是MySQL实现集合成员查找的SQL写法,其功能如下
函数原型:FIND_IN_SET(str,strlist)
功能释义:
假如字符串str 在由N 子链组成的字符串列表strlist 中, 则返回值的范围在 1 到 N 之间 。
一个字符串列表就是一个由一些被‘,’符号分开的自链组成的字符串。
如果第一个参数是一个常数字符串,而第二个是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)