Sql oracle正则表达式或内部函数用法
我有一个oracle表,其中有一列数据,如下所示Sql oracle正则表达式或内部函数用法,sql,regex,oracle,Sql,Regex,Oracle,我有一个oracle表,其中有一列数据,如下所示 CREATE TABLE AB ( id varchar2(10), URL varchar2(4000)); INSERT INTO AB (id, url) VALUES ( 1, "https://www.moveloot.com/sf?utm_source=linkedin&utm_medium=paid&utm_co
CREATE TABLE AB
( id varchar2(10),
URL varchar2(4000));
INSERT INTO AB (id, url)
VALUES (
1,
"https://www.moveloot.com/sf?utm_source=linkedin&utm_medium=paid&utm_content=bamboo&utm_campaign=San_Francisco_web_SF_SignUps_LAL_2_1839391141&utm_term=abc-123&utm_content=linked_in_ad-1");
COMMIT;
在oracle sql中,从url提取以下值的最佳方法是什么
utm_source = linkedin
utm_medium = paid
utm_content = bamboo
utm_campaign = San_Francisco_web_SF_SignUps_LAL_2_1839391141
utm_content = linked_in_ad-1
因此,首先要直接回答这个问题: Oracle直接支持提取与正则表达式()匹配的子字符串,所以我会这样做
SELECT REGEX_REPLACE(
REGEX_SUBSTR(ab.URL, 'utm_source=[^&]*'),
'utm_source=',
'') as UTM_SOURCE,--repeat for each sub-field
FROM AB ab
WHERE ab.id = 1;
这会有用的。。。但这将导致一些真正糟糕的SQL。不仅如此,如果您不得不从Oracle迁移(我的公司正在这么做),这可能需要重写
相反,如果该选项可用,我肯定会在前端进行字符串解析。在代码中,您可以执行以下操作:
Map<String, String> urlParams = new HashMap<String, String>();
if (url.contains("?"))
{
List<String> paramClauses = url.split("?")[1];
for(String clause : paramClauses)
{
urlParams.put(clause.split("=")[0], clause.split("=")[1]);
}
}
return urlParams;
Map urlParams=newhashmap();
if(url.contains(“?”)
{
List ParamClaires=url.split(“?”[1];
for(字符串子句:参数子句)
{
urlParams.put(子句.split(“”[0],子句.split(“”[1]);
}
}
返回URL参数;
或者,您可能需要对参数执行实际的关系逻辑。如果是这样的话,我会将它们解析成单独的列(因此utm_源、utm_媒体、utm_内容等各一列)。这涉及到一个数据架构问题,该问题超出了本场馆的范围。。。但是,如果您实际上需要从这些数据中获取url参数,那么这与这里的讨论非常接近