Oracle SQL 如何提取方括号内逗号分隔值并拆分plate字段为4个独立列
Oracle SQL 拆分固定格式方括号包裹的逗号分隔字段
针对plate字段存储的固定格式字符串(规则为方括号包裹、内部4个逗号分隔的数值,示例:[1,2,3,4]),可根据场景选型两种实现方案,无需编写复杂的递归拆分逻辑。
方案1:纯字符串截取实现(固定格式大表推荐)
无正则运算,全为Oracle基础字符串函数,执行效率更高,适合全量扫描大表的场景:
SELECT -- 第一列值 SUBSTR( TRIM(BOTH '[]' FROM plate), 1, INSTR(TRIM(BOTH '[]' FROM plate), ',', 1, 1) - 1 ) AS val1, -- 第二列值 SUBSTR( TRIM(BOTH '[]' FROM plate), INSTR(TRIM(BOTH '[]' FROM plate), ',', 1, 1) + 1, INSTR(TRIM(BOTH '[]' FROM plate), ',', 1, 2) - INSTR(TRIM(BOTH '[]' FROM plate), ',', 1, 1) - 1 ) AS val2, -- 第三列值 SUBSTR( TRIM(BOTH '[]' FROM plate), INSTR(TRIM(BOTH '[]' FROM plate), ',', 1, 2) + 1, INSTR(TRIM(BOTH '[]' FROM plate), ',', 1, 3) - INSTR(TRIM(BOTH '[]' FROM plate), ',', 1, 2) - 1 ) AS val3, -- 第四列值 SUBSTR( TRIM(BOTH '[]' FROM plate), INSTR(TRIM(BOTH '[]' FROM plate), ',', 1, 3) + 1 ) AS val4 FROM your_target_table;
方案2:正则表达式提取实现(代码简洁度优先)
写法更短,可读性更强,遇到格式不匹配的脏数据会自动返回NULL,方便排查异常:
SELECT REGEXP_SUBSTR(plate, '\[([^,]*),([^,]*),([^,]*),([^,]*)\]', 1, 1, NULL, 1) AS val1, REGEXP_SUBSTR(plate, '\[([^,]*),([^,]*),([^,]*),([^,]*)\]', 1, 1, NULL, 2) AS val2, REGEXP_SUBSTR(plate, '\[([^,]*),([^,]*),([^,]*),([^,]*)\]', 1, 1, NULL, 3) AS val3, REGEXP_SUBSTR(plate, '\[([^,]*),([^,]*),([^,]*),([^,]*)\]', 1, 1, NULL, 4) AS val4 FROM your_target_table;
方案说明:正则逻辑通过4个捕获组分别匹配方括号内、被逗号分隔的4个独立值,调用
REGEXP_SUBSTR时指定捕获组序号即可直接提取对应值,不需要手动计算字符串位置。如果后续格式规则调整(比如分隔值个数变化),只需要调整正则的捕获组数量即可,灵活性更高。
内容的提问来源于stack exchange,提问作者fmvpsenior
相关产品推荐
相关产品推荐

