[英]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
注意事项 -
{country}-{yyyy}{mm}{dd}-sometext-{state).{type}
,生成的文件名可能是usa-20200331-sometext-florida.txt
. (虽然 yyyymmdd 的相对顺序是固定的)。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.