PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

instrukcja if z łańcuchem zawierającym warunek

Z komentarzy w końcu myślę, że rozumiem. Potrzebujesz dynamicznego 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;

Należy jednak pamiętać, że ta konfiguracja jest szeroko otwarta na wstrzyknięcie SQL . Używaj tylko zweryfikowanych danych wejściowych. Funkcja działa w PostgreSQL 8.3 również (bez DO jeszcze oświadczenia).

Nie możesz odwoływać się do parametrów wewnątrz dynamicznego SQL (EXECUTE oświadczenie). Musisz umieścić wartość w ciągu zapytania.

W PostgreSQL 8.4 lub nowszym masz lepszy towar USING klauzula . Niestety nie w wersji 8.3. Powinieneś rozważyć aktualizację, jeśli możesz.

Wstawiłem obejście dla twojej starej wersji. Musisz szczególnie uważać na NULL wartość.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak działa pg_sleep_for() w PostgreSQL

  2. Co dzieje się z duplikatami podczas wstawiania wielu wierszy?

  3. Utwórz listę z pierwszym i ostatnim dniem miesiąca dla danego okresu

  4. Używanie pyspark do łączenia się z PostgreSQL

  5. JDBC Gotowy parametr instrukcji wewnątrz json