web-dev-qa-db-ja.com

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

列がある場合はcolumn a指定された値の場合、別の列が必要ですcolumn bdefault valueの値に応じてcolumn a

別の言葉で:
場合column a = 'peter'、次にcolumn b default value = 'doctor'

29
mosid

これは不可能です単純なDEFAULT値では マニュアルには明確に記載されています

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

代わりに trigger を使用できます:

CREATE OR REPLACE FUNCTION trg_foo_b_default()
  RETURNS trigger 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, you could use a lookup table:
SELECT INTO NEW.b  t.b
FROM   def_tbl t
WHERE  t.a = NEW.a;
*/

RETURN NEW;

END
$func$ LANGUAGE plpgsql;

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を明示的に挿入してデフォルトを無効にすることができます。ここでは不可能です。NULLbは、aから派生した値に置き換えられます。

43