Re: [pgsql-de-allgemein] Funktionsargument für eine "field IN ($1)" Bedingung

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

In response to

Browse pgsql-de-allgemein by date

  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