From: | Nicolas Barbier <nicolas(dot)barbier(at)gmail(dot)com> |
---|---|
To: | Andreas Tille <andreas(at)an3as(dot)eu> |
Cc: | PostgreSQL <pgsql-de-allgemein(at)postgresql(dot)org> |
Subject: | Re: [pgsql-de-allgemein] Funktionsargument für eine "field IN ($1)" Bedingung |
Date: | 2010-12-16 13:05:54 |
Message-ID: | AANLkTikFBgQsV2g2BaHaP7-9NfLGHANeutXrVv64xEux@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-de-allgemein |
Am 16. Dezember 2010 13:21 schrieb Andreas Tille <andreas(at)an3as(dot)eu>:
> On Thu, Dec 16, 2010 at 12:17:00PM +0100, Nicolas Barbier wrote:
>
>> query = 'SELECT * FROM mytable WHERE field IN (' || $1 || ') ;';
>>
>> (Achte auf die zusätzlichen Anführungszeichen.)
[..]
> Hinsichtlich Performance: Welche Alternativen hätte ich in einem solchen
> Fall?
Das EXECUTE-Statement kann man mithilfe von Arrays vermeiden:
CREATE OR REPLACE FUNCTION test_set_of_arguments (text[]) RETURNS
SETOF RECORD AS $$
Declare
r RECORD;
BEGIN
FOR r IN SELECT * FROM mytable WHERE field = ANY ($1) LOOP
RETURN NEXT r;
END LOOP;
END; $$ LANGUAGE 'plpgsql';
..und..
SELECT * FROM test_set_of_arguments( '{"eins", "drei"}' ) AS (field
text, value int) ;
Falls es möglich ist, die Funktion im Form eines einzelnen
SQL-Statements zu schreiben (so wie es jetzt eigentlich ist), ist es
typischerweise besser LANGUAGE 'sql' zu benutzen: solche Funktionen
können nämlich im aufrufenden SQL-Statement ge-inline-t werden, was
oft zu mehr Optimierungsmöglichkeiten führt. (VIEWs haben den gleichen
Vorteil.)
Nicolas
From | Date | Subject | |
---|---|---|---|
Next Message | Andreas 'ads' Scherbaum | 2010-12-20 15:12:25 | == Wöchentlicher PostgreSQL Newsletter - 19. Dezember 2010 == |
Previous Message | Andreas Tille | 2010-12-16 12:21:55 | Re: Funktionsargument für eine "field IN ($1)" Bedingung |