首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PostgreSQL函数从URL中提取HTTP参数

PostgreSQL函数从URL中提取HTTP参数
EN

Stack Overflow用户
提问于 2017-11-07 11:45:24
回答 1查看 3.1K关注 0票数 1

我想从一个表示URL的字符串中提取一个查询参数,我想在一个存储的函数中这样做(没有什么标准的函数可以使用?)。

在Python中,这将是:

代码语言:javascript
运行
复制
from urlparse import urlparse, parse_qs
def extract_oid(url):
    """
    extract the 'oid' query argument

    (simplified, no error handling)

    >>> extract_oid('http://some.host/some/path?oid=abc123&other')
    'abc123'
    """
    return parse_qs(urlparse(url).query)['oid'][0]

我目前在plpgsql中的尝试是:

代码语言:javascript
运行
复制
CREATE OR REPLACE FUNCTION extract_oid (link text)
RETURNS text
AS $$
DECLARE
  pos1 integer := position('&oid=' in link);
  tail text := substring(link from pos1 + 1);
  endpos integer := position('&' in tail);
BEGIN
  if link is NULL or pos1 = 0 then
    RETURN NULL;
  ELSIF endpos = 0 then
    RETURN substring(tail from 5);
  ELSE
    RETURN substring(tail from 5 for endpos - 1);
  END IF;
END;
$$ LANGUAGE plpgsql;

如果oid是查询字符串中的最后一个参数,并且至少有一个前任(否则我也需要识别?oid= ),那么它就能正常工作;但是,当有另一个&跟随时,它就会失败。我想成为这里的sefe ..。

endpos变量似乎有问题。

谁能指点我一下吗?谢谢!

我需要这个和PostgreSQL 9.3+一起工作。

编辑:

我发现了我的逻辑错误(当然我需要减去5而不是1,愚蠢的我),但是在马的回答之后,我的函数如下所示:

代码语言:javascript
运行
复制
CREATE OR REPLACE FUNCTION extract_oid (url text)
RETURNS text
AS $$
BEGIN
  RETURN split_part(substring(url from '[?&]oid=[^&]+'), '=', 2);
END;
$$ LANGUAGE plpgsql;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-07 12:00:58

除了在Python函数中使用Python代码之外,我还将使用正则表达式:

代码语言:javascript
运行
复制
split_part(substring(link from 'oid=\w+'), '=', 2)

substring(link from 'oid=\w+')将返回oid=abc123,然后split_part()将使用=作为分隔符提取第二个元素。

代码语言:javascript
运行
复制
with t (url) as (
  values 
    ('http://some.host/some/path?oid=abc123&other'), 
    ('http://some.host/some/path?other&oid=def456&foo=bar')
)
select split_part(substring(url from 'oid=\w+'), '=', 2)
from t;

将返回:

代码语言:javascript
运行
复制
split_part
----------
abc123    
def456    

我认为这也适用于9.3

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47157137

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档