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インジェクションに対して広く開かれていることに注意してください。 。検証済みの入力のみを使用してください。関数はPostgreSQL8.3で機能します 同様に(DOはありません まだステートメント)。

    動的SQL内のパラメーターを参照することはできません(EXECUTE 声明)。値をクエリ文字列に入力する必要があります。

    PostgreSQL 8.4以降では、 USING 条項 。残念ながら、バージョン8.3にはありません。可能であれば、アップグレードを検討する必要があります。

    私はあなたの古いバージョンの回避策を入れました。 NULLには特別な注意を払う必要があります 値。




    1. SQLServerで制約の名前を見つける方法

    2. Mysql/Phpmyadminのドイツ語ウムラウト

    3. ORA-02014を回避する方法:DISTINCT、GROUPBYなどのビューからFORUPDATEを選択できません

    4. 予期しないT_ENCAPSED_AND_WHITESPACE、T_STRINGまたはT_VARIABLEまたはT_NUM_STRINGエラーが予想されます