gpt4 book ai didi

PostgreSQL - 根据另一个单元格值设置默认单元格值

转载 作者:行者123 更新时间:2023-11-29 11:08:04 25 4
gpt4 key购买 nike

如果我有一个列说 column a 任何给定值,并且我希望另一列 column b 有一个 默认值a 列

的值

换句话说:
如果 a 列 = 'peter',则 b 列默认值 = 'doctor'

最佳答案

对于简单的 DEFAULT 值,这是不可能的,如 the manual clearly states :

The value is any variable-free expression (subqueries andcross-references to other columns in the current table are not allowed).

你可以使用 trigger相反:

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 default
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 FUNCTION trg_foo_b_default();

对于 Postgres 10 或更早版本,请改用 EXECUTE PROCEDURE ...。见:

为了提高效率,在触发器定义中使用 WHEN 子句(自 Postgres 9.0 起可用)。这样触发函数只有在真正有用的时候才会执行。 (假设如果 a IS NULL,我们可以让 b IS NULL 滑动。)

在 Postgres 12 或更高版本中,GENERATED 列可能是更好的解决方案。参见 jian's added answer .但是请注意,the manual 中的这些限制:

The generation expression can refer to other columns in the table, butnot other generated columns. Any functions and operators used must beimmutable. References to other tables are not allowed.

此触发器与 DEFAULT有细微的不同b 中的 null 始终替换为派生自 a 的值,而 DEFAULT 只是默认值,可以用任何显式输入来否决。
GENERATED 列不允许输入以开头。

关于PostgreSQL - 根据另一个单元格值设置默认单元格值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16737738/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com