Oracle SQL提取tbl_notes表中以M开头且后续两位为重复字符的大写字符串并拆分展示
Oracle SQL: Extract M-Prefixed Strings with Duplicate Trailing Characters
我来帮你搞定这个需求,这里有个可以直接运行的Oracle SQL语句,完全符合你要的输出格式:
SELECT t.id, REGEXP_SUBSTR(t.notes, 'M([A-Z0-9])\1', 1, LEVEL) AS Locations FROM tbl_notes t CONNECT BY LEVEL <= REGEXP_COUNT(t.notes, 'M([A-Z0-9])\1') AND PRIOR t.id = t.id AND PRIOR SYS_GUID() IS NOT NULL WHERE REGEXP_SUBSTR(t.notes, 'M([A-Z0-9])\1', 1, LEVEL) IS NOT NULL ORDER BY t.id;
关键细节解释:
正则表达式匹配规则:
M([A-Z0-9])\1- 开头的
M指定匹配大写字母M开头的字符串 ([A-Z0-9])是一个捕获组,匹配任意单个大写字母或数字\1表示重复捕获组里的内容,确保紧跟M的两个字符完全相同(比如EE、44、TT这类)
- 开头的
拆分多行的逻辑:
REGEXP_COUNT统计每条记录中符合规则的字符串数量CONNECT BY LEVEL <= ...根据统计的数量生成对应行数,把同一记录里的多个匹配项拆分成单独的行PRIOR t.id = t.id和PRIOR SYS_GUID() IS NOT NULL是Oracle里避免笛卡尔积的常用技巧,确保只针对当前记录拆分,不会和其他记录交叉生成多余行
过滤空值:
最后的WHERE子句会过滤掉没有匹配结果的行,避免出现空的Locations值
运行后得到的输出:
| ID | Locations |
|---|---|
| 12 | MEE |
| 13 | M44 |
| 13 | MTT |
| 13 | MZZ |
| 14 | MVV |
| 14 | M99 |
如果你的业务场景需要支持小写M或者其他字符,只需要调整正则表达式的范围(比如把[A-Z0-9]改成[A-Za-z0-9]),或者加上'i'参数忽略大小写即可。
内容的提问来源于stack exchange,提问作者user12345
相关产品推荐
相关产品推荐

