sql >> Databasteknik >  >> RDS >> PostgreSQL

if-sats med sträng som innehåller villkoret

Av kommentarerna tror jag äntligen att jag förstår. Du behöver dynamisk SQL :

CREATE OR REPLACE FUNCTION foo(lastcontact timestamptz)
  RETURNS void AS
$func$
DECLARE
   myrec  record;
   mycond boolean;
BEGIN

FOR myrec IN
    SELECT * FROM tabel ORDER BY colorlevel, volgnummer
LOOP
    IF myrec.conditie ~~ '%lastcontact %' THEN   -- special case for input param
        myrec.conditie := replace (myrec.conditie
                        , 'lastcontact '
                        , CASE WHEN lastcontact IS NULL THEN 'NULL '
                          ELSE '''' || lastcontact::text || ''' ' END);
    END IF;

    EXECUTE 'SELECT ' || myrec.conditie || ' FROM tabel' INTO mycond;

    IF mycond then
        RAISE NOTICE 'Condition % is true', myrec.conditie;
    ELSE
        RAISE NOTICE 'Condition % is false', COALESCE(myrec.conditie, 'NULL');
    END IF;
END LOOP;

END
$func$  LANGUAGE plpgsql;

Var dock medveten om att den här installationen är öppen för SQL-injektion . Använd endast verifierad inmatning. En funktion fungerar i PostgreSQL 8.3 likaså (ingen DO uttalanden, ännu).

Du kan inte referera till parametrar i dynamisk SQL (EXECUTE påstående). Du måste lägga in värdet i frågesträngen.

I PostgreSQL 8.4 eller senare har du den överlägsna varan av USING klausul . Tyvärr, inte i version 8.3. Du bör överväga att uppgradera om du kan.

Jag har lagt in en lösning för din gamla version. Du måste ta särskild hand om NULL värde.




  1. ASIN() Exempel i SQL Server

  2. Saker du måste veta om FND_LOBS Table i Oracle Apps

  3. mysqli eller PDO - vilka är för- och nackdelarna?

  4. Vilka är de 10 bästa funktionerna i Microsoft Access?