2017-11-07 15 views
0

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) 

答えて

1

別にPython functionであなたのPythonコードを使用してから、私はこのための正規表現を使用しますはoid=abc123を返し、split_part()は、=を区切り文字として使用して2番目の要素を抽出します。

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; 

が返されます:

split_part 
---------- 
abc123  
def456  

私はそれが同様に

+1

はい、ありがとうございました9.3で動作するはずだと思います!私は、 '' [?&] oid = [^&] + ''に 'from'式を変更して' otherprefixoid'変数を無視し、非単語文字も許可しました。 – Tobias

関連する問題