You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 14:47:23