PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

if-изявление с низ, съдържащ условието

От коментарите най-накрая мисля, че разбирам. Имате нужда от динамичен 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;

Имайте предвид обаче, че тази настройка е широко отворена за SQL инжектиране . Използвайте само потвърден вход. Функция работи в PostgreSQL 8.3 също (без DO изявления, все още).

Не можете да препращате към параметри в динамичния SQL (EXECUTE изявление). Трябва да поставите стойността в низа на заявката.

В PostgreSQL 8.4 или по-нова версия имате превъзходната стока на USING клауза . Уви, не във версия 8.3. Трябва да помислите за надграждане, ако можете.

Въведох заобиколно решение за старата ви версия. Трябва да обърнете специално внимание на NULL стойност.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ограничение на Postgres

  2. Как да съпоставя регулярен израз на колона за PostgreSQL в EF Core?

  3. Трябва да инсталирате postgresql-server-dev-X.Y за изграждане на разширение от страна на сървъра или libpq-dev за изграждане на приложение от страна на клиента

  4. Как да използвам PostgreSQL JSON(B) оператори, съдържащи въпросителен знак? чрез JDBC

  5. Как автоматично да затворя неактивни връзки в PostgreSQL?