sql >> Database teknologi >  >> RDS >> PostgreSQL

if-sætning med streng, der indeholder betingelsen

Ud fra kommentarerne tror jeg endelig, at jeg forstår. Du skal bruge 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;

Vær dog opmærksom på, at denne opsætning er åben for SQL-injektion . Brug kun bekræftet input. En funktion virker i PostgreSQL 8.3 også (ingen DO udsagn, endnu).

Du kan ikke henvise til parametre i dynamisk SQL (EXECUTE udmelding). Du skal indsætte værdien i forespørgselsstrengen.

I PostgreSQL 8.4 eller nyere har du den overlegne vare fra USING klausul . Ak, ikke i version 8.3. Du bør overveje at opgradere, hvis du kan.

Jeg har lagt en løsning til din gamle version. Du skal være særlig opmærksom på NULL værdi.




  1. I stedet for Triggers i mysql

  2. Glassfish opretter ikke JDBC-ressourcer

  3. Php, Mysql Vælg fra tabel, hvor række =? det er muligt?

  4. Eksporter specifikke rækker fra en PostgreSQL-tabel som INSERT SQL-script