如何在SQL Developer中用REGEXP_SUBSTR提取标记间的每日价格?
在SQL Developer中提取相同标签间的数值
针对你给出的字符串格式,我们可以通过正则反向引用匹配前后重复的标签,再提取中间的数值,具体实现如下:
1. 拆分原始字符串为单个条目
先把逗号分隔的monday12monday、tuesday567.12tuesday这类片段拆分成单独行,用CONNECT BY配合REGEXP_SUBSTR实现。
2. 提取标签和数值
利用正则的捕获组+反向引用,确保前后标签一致,分别提取标签和中间的数值:
- 标签捕获:用
([a-z]+)匹配标签,\1引用前面的捕获组,保证前后标签相同 - 数值捕获:匹配标签之间的整数或小数(
\d+(\.\d+)?)
基础提取SQL示例
WITH sample_data AS ( -- 替换成你实际的列或字符串 SELECT 'monday12monday, tuesday567.12tuesday, friday87friday' AS input_str FROM dual ) SELECT -- 提取重复的标签 REGEXP_SUBSTR(TRIM(item), '([a-z]+)\d+(\.\d+)?\1', 1, 1, NULL, 1) AS day_label, -- 提取标签间的数值 REGEXP_SUBSTR(TRIM(item), '([a-z]+)(\d+(\.\d+)?)\1', 1, 1, NULL, 2) AS price FROM ( -- 拆分逗号分隔的每个条目 SELECT REGEXP_SUBSTR(input_str, '[^,]+', 1, LEVEL) AS item FROM sample_data CONNECT BY REGEXP_SUBSTR(input_str, '[^,]+', 1, LEVEL) IS NOT NULL ) ORDER BY day_label;
匹配期望的换行格式
如果需要输出和示例一致的换行排版,用LISTAGG拼接字符串,配合换行符CHR(10):
WITH sample_data AS ( SELECT 'monday12monday, tuesday567.12tuesday, friday87friday' AS input_str FROM dual ) SELECT LISTAGG(day_label || CHR(10) || price || CHR(10) || CHR(10), '') WITHIN GROUP (ORDER BY day_label) AS formatted_result FROM ( SELECT REGEXP_SUBSTR(TRIM(item), '([a-z]+)\d+(\.\d+)?\1', 1, 1, NULL, 1) AS day_label, REGEXP_SUBSTR(TRIM(item), '([a-z]+)(\d+(\.\d+)?)\1', 1, 1, NULL, 2) AS price FROM ( SELECT REGEXP_SUBSTR(input_str, '[^,]+', 1, LEVEL) AS item FROM sample_data CONNECT BY REGEXP_SUBSTR(input_str, '[^,]+', 1, LEVEL) IS NOT NULL ) );
关键说明
TRIM(item):处理条目前后的空格(比如原始字符串中逗号后的空格)- 正则中的
[a-z]+:如果标签包含大写字母,改成[a-zA-Z]+;如果有其他特殊字符,按需调整匹配范围 - 反向引用
\1:确保前后标签完全一致,这是解决问题的核心,之前方法失效大概率是没用到这个逻辑
内容的提问来源于stack exchange,提问作者Aya
相关产品推荐
相关产品推荐

