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

PostgreSQL-別のセル値に従ってデフォルトのセル値を設定します

    これは不可能です シンプルなDEFAULT マニュアルに明記されているように、値:

    値は変数のない式です(現在のテーブルの他の列へのサブクエリおよび相互参照は許可されていません)。

    トリガーを使用できます 代わりに:

    CREATE OR REPLACE FUNCTION trg_foo_b_default()
      RETURNS trigger
      LANGUAGE plpgsql AS
    $func$
    BEGIN
       -- For just a few constant options, CASE does the job:
       NEW.b := CASE NEW.a
                   WHEN 'peter'  THEN 'doctor'
                   WHEN 'weirdo' THEN 'shrink'
                   WHEN 'django' THEN 'undertaker'
                   ELSE NULL
                END;
    
       /*
       -- For more, or dynamic options, consider a lookup table:
       SELECT INTO NEW.b  t.b
       FROM   def_tbl t
       WHERE  t.a = NEW.a;
       */
    
       RETURN NEW;
    END
    $func$;
    
    
    CREATE TRIGGER b_default
    BEFORE INSERT ON foo
    FOR EACH ROW
    WHEN (NEW.b IS NULL AND NEW.a IS NOT NULL)
    EXECUTE PROCEDURE trg_foo_b_default();
    

    より効率的にするには、WHENを使用します トリガー定義の句(Postgres 9.0以降で使用可能):この方法では、トリガー関数は実際に役立つ場合にのみ実行されます。 (b IS NULLを許可できると仮定します a IS NULLの場合はスライドします 。)

    同様に機能しますが、微妙に異なります DEFAULTからのファッション 値。
    デフォルト値では、NULLを明示的に挿入できます。 デフォルトを無効にします。ここでは不可能です、NULL baから派生した値に置き換えられます 。



    1. SQLの文字列で最初に出現する部分文字列を置き換えます

    2. MariaDB CEIL()の説明

    3. MySQLの集計関数-リスト(OracleのLISTAGGなど)

    4. テーブルの行を更新する方法、または行が存在しない場合は挿入する方法を教えてください。