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

PLSQL如何提取字符串中大括号{}外部的静态文本片段

解决方案

完整实现SQL(保留原有变量列+新增静态片段列)

WITH
     inputs (str) AS (
       SELECT '{user}_{yyyymmdd}_dailyreport.{type}'
       FROM   dual
     ),
     var_count AS (
       SELECT LENGTH(str) - LENGTH(REPLACE(str, '{')) AS cnt FROM inputs
     )
SELECT 
  level AS ord,
  SUBSTR(
    str, 
    INSTR(str, '{', 1, level) + 1, 
    INSTR(str, '}', 1, level) - INSTR(str, '{', 1, level) - 1
  ) AS data,
  CASE 
    WHEN level < (SELECT cnt FROM var_count) THEN 
      SUBSTR(
        str,
        INSTR(str, '}', 1, level) + 1,
        INSTR(str, '{', 1, level + 1) - INSTR(str, '}', 1, level) - 1
      )
    ELSE NULL 
  END AS "STATIC SEGMENTS"
FROM inputs
CONNECT BY level <= (SELECT cnt FROM var_count)
;

输出结果

ORD   DATA        STATIC SEGMENTS
----- ----------- --------------------
1     user        _
2     yyyymmdd    _dailyreport.
3     type        NULL

如果你只需要单独输出静态片段,可以使用下面的简化版本:

WITH
     inputs (str) AS (
       SELECT '{user}_{yyyymmdd}_dailyreport.{type}'
       FROM   dual
     )
SELECT 
  level AS ord,
  SUBSTR(
    str,
    INSTR(str, '}', 1, level) + 1,
    INSTR(str, '{', 1, level + 1) - INSTR(str, '}', 1, level) - 1
  ) AS "STATIC SEGMENTS"
FROM inputs
CONNECT BY level <= LENGTH(str) - LENGTH(REPLACE(str, '{')) - 1
;

输出结果和预期完全一致:

ORD   STATIC SEGMENTS
----- --------------------
1     _
2     _dailyreport.

逻辑说明

  • 静态片段固定位于前一个变量的闭合符}和后一个变量的起始符{之间,通过INSTR定位相邻两个符号的位置,计算截取长度后用SUBSTR提取即可
  • 静态片段的总数始终等于变量总数减1,所以单独查询静态片段时递归层级比提取变量的查询少1级

内容的提问来源于stack exchange,提问作者yorpa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 23:45:03