Oracle regexp_instr函数转换为PostgreSQL等效实现方案问询
Oracle到PostgreSQL 12的函数迁移方案
原Oracle代码的核心逻辑是:从inColumnDdl字符串中,通过不区分大小写的正则表达式regMatch匹配第一个符合条件的子串,截取该子串并转为大写后赋值给varColName。
简洁实现方案(PostgreSQL)
直接使用regexp_match函数获取匹配子串,再转大写即可,这是最贴合需求的简化写法:
varColName := upper((regexp_match(inColumnDdl, regMatch, 'i'))[1]);
逻辑说明
regexp_match(inColumnDdl, regMatch, 'i'):执行不区分大小写('i'参数)的正则匹配,返回包含第一个匹配子串的数组。(...)[1]:取出数组中的第一个匹配结果(对应原Oracle逻辑里的第一个匹配项)。upper(...):将匹配到的子串转为大写,和原Oracle逻辑完全一致。
模拟原Oracle位置计算的实现(可选)
如果需要完全复刻原Oracle通过起始/结束位置差截取的逻辑,可以结合regexp_position和length函数实现:
DECLARE match_result text[] := regexp_match(inColumnDdl, regMatch, 'i'); start_pos integer; BEGIN IF match_result IS NOT NULL THEN start_pos := regexp_position(inColumnDdl, regMatch, 1, 1, 'i'); varColName := upper(substr(inColumnDdl, start_pos, length(match_result[1]))); ELSE varColName := NULL; -- 无匹配时的处理逻辑,和原Oracle保持一致 END IF; END;
内容的提问来源于stack exchange,提问作者Mohamedmehdi Ellouze
相关产品推荐
相关产品推荐

