我在表格列中保存了以这种格式保存的网页链接:
https://website.com/?variable1=aaa&variable2=222&variable3=ccc&variable4=dd44
可能有不同的页面名称,不同的参数计数等。
我的目标是获得“variable2”的值,即“222”。我们可以假设“variable2”始终存在于链接中。
到目前为止,我遇到过这种解决方案,它可以正常工作,但看起来效率不高:
select
substring(t.link, position('variable2=' in t.link)+10,
position('&' in substring(t.link, position('variable2=' in t.link)+10))-1)
from
(select
'https://website.com/?variable1=aaa&variable2=222&variable3=ccc&variable4=dd44' as link
)t;
我相信这可以通过一个子字符串函数完成:
substring(string from pattern for escape)
到目前为止,我设法获得子串直到最后一次出现“&”这两种不同的方法:
substring(t.link from '%variable2=#"%#"&%' for '#'),
substring(t.link from 'variable2=(.+)&')
他们都给出相同的结果:“222& variable3 = ccc”
提前谢谢!
答案 0 :(得分:1)
您可以使用子字符串提取键/值对,然后使用split_part()
提取分隔值:
split_part(substring(link from 'variable2=[^&]+'), '=', 2);
答案 1 :(得分:0)
使用正则表达式lookbehind的另一种解决方案:
select (regexp_matches(link,'(?<=variable2=)[^&]*'))[1]
FROM mytable
(?<=variable=)
匹配以variable=
[^&]*
匹配第一个&
regexp_matches
返回一个数组,我们想要第一个( only )匹配。
数组索引[1]
选择第一个匹配。
<强>更新强>
由于我们对第一场比赛感兴趣,以下声明也有效:
select substring(link from '(?<=variable2=)[^&]*')
from mytable