sql >> データベース >  >> RDS >> PostgreSQL

IFステートメントの条件としての動的SQL(EXECUTE)

    この構成は不可能です:

    IF EXECUTE 'EXISTS (SELECT 1 FROM mytable)' THEN ...

    次のように簡略化できます:

    IF EXISTS (SELECT 1 FROM mytable) THEN ...
    

    しかし、あなたの例はおそらく単純化されています。 動的SQLの場合 EXECUTEで実行 、こちらのマニュアルをお読みください。特殊変数FOUNDを確認できます DMLコマンドを実行した直後に、ここの行が影響を受けているかどうかを確認します:

    IF FOUND THEN ...
    

    ただし:

    特にEXECUTEに注意してください GET DIAGNOSTICSの出力を変更します 、ただし、FOUNDは変更されません 。

    大胆な強調鉱山。プレーンなEXECUTEの場合 代わりにこれを行ってください:

    ...
    DECLARE
       i int;
    BEGIN
       EXECUTE 'SELECT 1 FROM mytable';  -- something dynamic here
    
       GET DIAGNOSTICS i = ROW_COUNT;
    
       IF i > 0 THEN ...
    

    または 適切な場合(特に単一行の結果のみの場合)は、 INTOを使用します EXECUTEを含む句 動的クエリから直接結果を取得します。ここでマニュアルを引用します:

    行または変数のリストを指定する場合は、クエリの結果の構造と完全に一致する必要があります(レコード変数を使用すると、結果の構造と自動的に一致するように構成されます)。複数の行が返された場合、最初の行のみがINTOに割り当てられます。 変数。行が返されない場合、NULLがINTOに割り当てられます 変数。

    ...
    DECLARE
       _var1 int;  -- init value is NULL unless instructed otherwise
    BEGIN
    
    EXECUTE format('SELECT var1 FROM %I WHERE x=y LIMIT 1', 'my_Table')
    INTO    _var1;
    
    IF _var1 IS NOT NULL THEN ...
    


    1. 制約を変更する方法

    2. Neo4j-Cypherを使用してノードを作成する

    3. MySQLで小数点を変更する

    4. PostgreSQLでのScale()関数のしくみ