【发布时间】:2021-11-24 06:40:03
【问题描述】:
我有一个文件模式,例如{user}_{yyyymmdd}_dailyreport.{type},我用它来提取左大括号和右大括号{}之间的值
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) - instr(str, '{', 1, level) - 1) as data
from inputs
connect by level <= length(str) - length(replace(str, '{'))
;
输出这个
ORD DATA
----- ----------
1 user
2 yyyymmdd
3 type
在一个单独的列中,我想获得这个
ORD STATIC SEGMENTS
----- ----------
1 _
2 _dailyreport.
但不确定如何获得。它基本上代表了没有包含在一对左大括号中的每个文本
【问题讨论】:
-
大括号中的表达式是否总是出现在字符串的开头和结尾?花括号中的表达式是否总是由长度至少为一个的子字符串分隔?一般来说,返回所有不在大括号中的子字符串是最有意义的,包括在第一个
{之前和最后一个}之后,以及大括号表达式之间,即使其中一些可能是空字符串 (@987654328 @ 在 Oracle 中)。单独的问题:你的字符串中是否也有“文字”花括号,也许以某种方式转义? -
大括号中的表达式是否总是出现在字符串的开头和结尾? - 是的。
{User}将永远是第一个令牌,{Type}将是最后一个。你的字符串中是否也有“文字”花括号 - 没有。 -
字符串中间可能有其他标记,如
{yyyymmdd}、{country_code}等,以及字符串的固定部分(本例中为_dailyreport.),不一定在任何固定顺序。 -
当我们最终得到一个遵循模式的文件名时(例如,在这种情况下为
yorpa_20201001_dailyreport.json),我们希望通过静态段将它们映射到标记来提取信息。我们的最终输出(不在此问题的范围内,但在此处添加上下文)应该是1. user - yorpa 2. yyyymmdd - 20201001 3. type - json -
您的最新示例中没有任何花括号,那么它与您的问题有什么关系?