如何使用Oracle REGEXP拆分含ID标识的长字符串?
Oracle正则表达式拆分长字符串实现方案
可以实现需求,利用Oracle的REGEXP_SUBSTR函数即可将长字符串拆分为独立语句并放入不同列,以下是具体实现方式:
核心思路
通过正则表达式匹配每个以句号(可选后续空格)结尾的独立语句,使用REGEXP_SUBSTR的捕获组提取语句内容,同时指定匹配位置来拆分出不同的语句列。
针对示例数据的SQL实现
处理Row1数据
SELECT REGEXP_SUBSTR(Row1, '([^.]+)\. ?', 1, 1, NULL, 1) AS 语句1, REGEXP_SUBSTR(Row1, '([^.]+)\. ?', 1, 2, NULL, 1) AS 语句2 FROM ( SELECT 'van dam is brother of Prince Charles(12345). Mathew Perker is son of Prince Charles(12345).' AS Row1 FROM dual );
执行后会得到两列结果,分别对应两个独立语句。
处理Row2数据
SELECT REGEXP_SUBSTR(Row2, '([^.]+)\. ?', 1, 1, NULL, 1) AS 语句1, REGEXP_SUBSTR(Row2, '([^.]+)\. ?', 1, 2, NULL, 1) AS 语句2, REGEXP_SUBSTR(Row2, '([^.]+)\. ?', 1, 3, NULL, 1) AS 语句3 FROM ( SELECT 'Madam Currie is grandmother of Albert Eistine(56789). Pieer Currie is grandfather of Albert Eistine(56789). CV Raman is friend of Albert Eistine(56789).' AS Row2 FROM dual );
执行后会得到三列结果,对应三个独立语句。
正则表达式说明
([^.]+)\. ? 的含义:
[^.]+:匹配除句号外的任意字符序列(即语句主体内容)\.:匹配语句结尾的句号?:匹配句号后可选的空格- 通过
REGEXP_SUBSTR的第6个参数指定提取第1个捕获组的内容,自动去除结尾的句号和空格。
从表中查询的通用写法
假设你的表名为target_table,包含id(对应括号内的数字)和long_content(存储长字符串的字段),可以直接扩展列来适配不同行数的语句数量:
SELECT id, REGEXP_SUBSTR(long_content, '([^.]+)\. ?', 1, 1, NULL, 1) AS statement_1, REGEXP_SUBSTR(long_content, '([^.]+)\. ?', 1, 2, NULL, 1) AS statement_2, REGEXP_SUBSTR(long_content, '([^.]+)\. ?', 1, 3, NULL, 1) AS statement_3 -- 如需更多列,继续按此格式添加即可 FROM target_table;
对于语句数量不足的行,对应的列会返回NULL,符合需求。
内容的提问来源于stack exchange,提问作者Kaustav Nandy
相关产品推荐
相关产品推荐

