Oracle中如何用REGEXP_SUBSTR拆分字符串并返回多行数据
问题分析与解决
问题原因
你写的正则表达式^\d+(,\d+)*$是用来匹配整个完整的逗号分隔数字串的,它的逻辑是:以数字开头,后续可以重复任意次「逗号+数字」的组合。所以只有当level=1时,能匹配到整个字符串;level=2、level=3时,找不到对应位置的匹配项,返回空值。
正确写法
要提取每个逗号分隔的数字段,需要把正则改成匹配单个数字段的模式,比如用[^,]+(匹配任意非逗号的字符序列,通用型强)或者\d+(仅匹配数字,适合纯数字场景)。修改后的SQL如下:
with rws as ( select '143,3344,40099' str from dual ) select regexp_substr( str, '[^,]+', 1, level ) value from rws connect by level <= length(str) - length(replace(str, ',')) + 1;
执行后会返回三行独立的数字:
- 143
- 3344
- 40099
另外注意,原SQL里直接硬编码了目标字符串,改成引用CTE里的str字段更规范,也方便后续修改字符串内容。
内容的提问来源于stack exchange,提问作者FrenkyB
相关产品推荐
相关产品推荐

