sql >> Database >  >> RDS >> PostgreSQL

if-statement met string die de voorwaarde bevat

Uit de reacties denk ik eindelijk dat ik het begrijp. U hebt dynamische SQL nodig :

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;

Houd er echter rekening mee dat deze opstelling wijd open staat voor SQL-injectie . Gebruik alleen geverifieerde invoer. Een functie werkt in PostgreSQL 8.3 ook (geen DO verklaringen, nog niet).

U kunt niet verwijzen naar parameters in dynamische SQL (EXECUTE uitspraak). U moet de waarde in de queryreeks invoeren.

In PostgreSQL 8.4 of later heb je de superieure grondstof van de USING clausule . Helaas, niet in versie 8.3. Overweeg om te upgraden als je kunt.

Ik heb een oplossing voor je oude versie gemaakt. Je moet speciaal letten op de NULL waarde.




  1. Hoe cluster-40926 uit mijn dataroot in moodle te verwijderen

  2. beste manier om gegevens in mysql te importeren

  3. Grails:wijs mysql-veld van het type enum toe aan domeinklasse

  4. Een enkele rij bijwerken met t-sql