2017-11-07 13 views
0

URL을 나타내는 문자열에서 쿼리 인수를 추출하고 싶습니다. 저장된 함수에서 쿼리 인수를 추출하고 싶습니다. 사용할 수있는 표준 함수는 무엇입니까?).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 이상에서 작동하려면이 기능이 필요합니다. 내 논리적 오류를 발견

(물론 나는 나를 바보, 1보다는 5를 뺄 필요), 그러나 말의 대답 후, 내 기능은 다음과 같습니다 : 편집

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에 파이썬 코드를 사용에서,이에 대한 정규 표현식을 사용합니다은 oid=abc123을 반환하고 split_part()=을 구분 기호로 사용하여 두 번째 요소를 추출합니다.

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에서 작동한다고 생각합니다! 나는 'from'표현을''[? &] oid = [^ &] + ''로 변경하여'otherprefixoid' 변수를 무시하고 비 단어 문자도 허용했습니다. – Tobias