如何在Oracle sql中剪切字符串并返回子字符串

时间:2018-05-11 16:36:13

标签: sql regex oracle

我的项目中有一个要求,我需要拆分url并从中提取变量,url是其中一个表中的列。网址看起来像这样

输入行

"http://example.com/wps/myportal/example/viewer?mstrContentType=Report&   mstrId=15F4AC9C4453E5F75456438F732F7B8C&contentName=7.++CTI+Session+Order+Counts&proj=System+Xr+-+DMDR/CW&workspaceName=&woId=&vendorId=Microstrategy"

我需要o / p如下与目标列进行比较,如下所示

ContentType=Report
mstrId=15F4AC9C4453E5F75456438F732F7B8C
contentName=7.++CTI+Session+Order+Counts
etc...

我只能使用Oracle,不应该使用程序设计语言。

感谢。

2 个答案:

答案 0 :(得分:1)

这里只需要使用REGEXP_SUBSTR,如下所示。

create table test1(col1 varchar2(4000));
insert into test1 values(
'http://example.com/wps/myportal/example/viewer?mstrContentType=Report&   mstrId=15F4AC9C4453E5F75456438F732F7B8C&contentName=7.++CTI+Session+Order+Counts&proj=System+Xr+-+DMDR/CW&workspaceName=&woId=&vendorId=Microstrategy'
);

select regexp_substr(col1,'[^?"]+',1,2) ss from test1;

select trim(regexp_substr(regexp_substr(col1,'[^?"]+',1,2),'[^&]+', 1, level)) as output_data from test1
connect by regexp_substr(regexp_substr(col1,'[^?"]+',1,2), '[^&]+', 1, level) is not null;

<强> OUTPUT_DATA

mstrContentType=Report
mstrId=15F4AC9C4453E5F75456438F732F7B8C
contentName=7.++CTI+Session+Order+Counts
proj=System+Xr+-+DMDR/CW
workspaceName=
woId=
vendorId=Microstrategy

答案 1 :(得分:0)

如果您的网址字符串采用可预测的格式,您可以使用regexp_replace

捕获网址的匹配部分
select regexp_replace(
    regexp_substr(url, '[?&]mstrContentType=([^&]*)')
    '[^=]*=(.*)'
    '\1'
)

这将返回mstrContentType参数的值 - 等号右边但在下一个参数之前的子字符串。