PostgreSQL函数从URL中提取HTTP查询参数

时间:2017-11-07 11:45:24

标签: postgresql plpgsql postgresql-9.3

我想从表示URL的字符串中提取查询参数,我想在存储函数中执行它(我可以使用一些标准函数吗?)。

在Python中,这将是:

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的尝试是:

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=),这样可以正常工作;但是,当有另一个&跟随时,它会失败。我想在这里... ...

endpos变量似乎有问题。

有人可以赐教吗?谢谢!

我需要这个才能使用PostgreSQL 9.3 +。

修改

我发现了我的逻辑错误(当然我需要减去5而不是1,愚蠢的我),但在马的答案之后,我的功能看起来像这样:

CREATE OR REPLACE FUNCTION extract_oid (url text)
RETURNS text
AS $$
BEGIN
  RETURN split_part(substring(url from '[?&]oid=[^&]+'), '=', 2);
END;
$$ LANGUAGE plpgsql;

1 个答案:

答案 0 :(得分:1)

除了在Python function中使用Python代码外,我还会使用正则表达式:

carriage return

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

split_part()

将返回:

=

我认为这应该适用于9.3