从链接字符串中提取变量值

时间:2018-05-24 06:00:14

标签: postgresql substring

我在表格列中保存了以这种格式保存的网页链接:

  

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”

提前谢谢!

2 个答案:

答案 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