URLを表す文字列からクエリ引数を抽出したいのですが、これは保存された関数で実行したいと思います。私が使うことができる標準的な機能?)。 PythonでURLからHTTPクエリ引数を抽出するPostgreSQL関数
、これは次のようになります。
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=
を認識する必要があるでしょう)。ただし、次のような場合には別の&
があると失敗します。私はここでsefeしたいと思います...
変数は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;
split_part(substring(link from 'oid=\w+'), '=', 2)
:
はい、ありがとうございました9.3で動作するはずだと思います!私は、 '' [?&] oid = [^&] + ''に 'from'式を変更して' otherprefixoid'変数を無視し、非単語文字も許可しました。 – Tobias