【问题标题】:Split string by patterns, and map resulting tokens to respective pattern in PL/SQL按模式拆分字符串,并将生成的标记映射到 PL/SQL 中的相应模式
【发布时间】:2021-11-23 01:31:21
【问题描述】:

我有一个由一组模式组成的字符串。这种模式字符串的一个例子是{yyyy}{mm}{dd}_{country}_{state}_jobsreport.{type}。我用正则表达式替换字符串中的每个模式(例如 - yyyy 被替换为 ([1-9][0-9]{3}) 代表所有可能的年份值)。基于这个正则表达式,我查询并得到一个文件名跟随正则表达式的文件,例如 - 20200331_japan_kyushu_jobsreport.json。

现在我需要将每个标记映射到其对应的模式。例如-

year = 2020
month = 03
date = 31
country = japan
state = kyushu
type = json

注意事项 -

  1. 模式的顺序 - 模式的顺序不固定。例如,在我们的例子中,模式可能是{country}-{yyyy}{mm}{dd}-sometext-{state).{type},结果文件名可能是usa-20200331-sometext-florida.txt。 (虽然 yyyymmdd 的相对顺序是固定的)。
  2. 分隔符 - 没有特定的分隔符。对于20200331_japan_kyushu_jobsreport.json,分隔符是{"_",".","jobsreport"}。同样对于usa-20200331-sometext-florida.txt,分隔符是{"-",".","sometext"}

如何在 PL/SQL 中处理这种映射?像REGEXP_SUBSTR 这样的普通函数在一组固定的分隔符上工作,而这里的分隔符可以变化。

【问题讨论】:

  • 您是否尝试过创建一个函数,将其作为 varchar2 字符串返回?如果不是,您可以很容易地创建一个按顺序连接字符串的函数。只需将字符串添加到到目前为止构建的字符串中。

标签: sql regex plsql


【解决方案1】:

你可以做一个函数。如果这是一个始终会弹出相同值的固定规则,您可以按照以下方式进行操作:

CREATE FUNCTION BuildFileName
( 
    param varchar2
) return varchar2
AS
    variable1 varchar2(100);
    variable2 varchar2(100);
    variable3 varchar2(100);
    v_cstring varchar2(1000);
BEGIN
    begin
        SELECT 'v1',null,'v3'
        INTO variable1, variable2, variable3
        FROM dual;
        exception when no_data_found then
        return null;
    end;
    
    IF variable1 IS NOT NULL THEN
        v_cstring := v_cstring || variable1;
    END IF;
    
    IF variable2 IS NOT NULL THEN
        IF substr(variable2, length(variable2), 1) NOT IN ('_', '.') THEN
            v_cstring := v_cstring || '_';
        END IF;
        v_cstring := v_cstring || variable2;
    END IF;
    
    IF variable3 IS NOT NULL THEN
        IF substr(variable2, length(variable2), 1) NOT IN ('_', '.') THEN
            v_cstring := v_cstring || '.';
        END IF;
        v_cstring := v_cstring || variable3;
    END IF;
    
END BuildFileName;

【讨论】:

    猜你喜欢
    • 2018-11-10
    • 2018-02-06
    • 2013-04-11
    • 1970-01-01
    • 2022-07-12
    • 2019-04-22
    • 2019-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多