繁体   English   中英

按模式拆分字符串,并将 map 结果标记转换为 PL/SQL 中的相应模式

[英]Split string by patterns, and map resulting tokens to respective pattern in PL/SQL

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

现在我需要将每个令牌 map 为其相应的模式。 例如-

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这样的普通函数在一组固定的分隔符上工作,而这里的分隔符可以变化。

您可以制作一个 function。如果这是一个设置规则,相同的值将始终弹出,您可以按照以下方式执行操作:

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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM