sql >> Databáze >  >> RDS >> PostgreSQL

if-příkaz s řetězcem obsahujícím podmínku

Podle komentářů si konečně myslím, že tomu rozumím. Potřebujete dynamické 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;

Uvědomte si však, že toto nastavení je široce otevřené pro vkládání SQL . Používejte pouze ověřený vstup. Funkce funguje v PostgreSQL 8.3 také (žádné DO prohlášení, zatím).

Nemůžete odkazovat na parametry uvnitř dynamického SQL (EXECUTE tvrzení). Hodnotu musíte vložit do řetězce dotazu.

V PostgreSQL 8.4 nebo novějším máte lepší komoditu USING doložka . Bohužel ne ve verzi 8.3. Pokud můžete, měli byste zvážit upgrade.

Vložil jsem řešení pro vaši starou verzi. Musíte věnovat zvláštní péči NULL hodnotu.




  1. Jaký je rozdíl mezi int a celým číslem v MySQL 5.0?

  2. Nalezení rozdílu mezi dvěma řádky v tabulce. Věštec

  3. pokud má tabulka 4 sloupce a chci načíst 3. sloupec, co mám dělat.

  4. MySql - Problém tabulek na jiném serveru rozlišuje malá a velká písmena