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

前端之家收集整理的这篇文章主要介绍了PostgreSQL – 根据另一个单元格值设置默认单元格值前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如果我有一个列表示任何给定值的列a,并且我想要另一个列列b根据列a的值具有默认值

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

这是不可能的简单的一个DEFAULT值,如 the manual clearly states

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

您可以使用trigger

  1. CREATE OR REPLACE FUNCTION trg_foo_b_default()
  2. RETURNS trigger AS
  3. $func$
  4. BEGIN
  5.  
  6. -- For just a few constant options,CASE does the job:
  7. NEW.b :=
  8. CASE NEW.a
  9. WHEN 'peter' THEN 'doctor'
  10. WHEN 'weirdo' THEN 'shrink'
  11. WHEN 'django' THEN 'undertaker'
  12. ELSE NULL
  13. END;
  14.  
  15. /* -- For more,or dynamic options,you could use a lookup table:
  16. SELECT INTO NEW.b t.b
  17. FROM def_tbl t
  18. WHERE t.a = NEW.a;
  19. */
  20.  
  21. RETURN NEW;
  22.  
  23. END
  24. $func$LANGUAGE plpgsql;
  25.  
  26. CREATE TRIGGER b_default
  27. BEFORE INSERT ON foo
  28. FOR EACH ROW
  29. WHEN (NEW.b IS NULL AND NEW.a IS NOT NULL)
  30. EXECUTE PROCEDURE trg_foo_b_default();

为了使此更有效,我使用WHEN子句(可从Postgres 9.0开始使用)与触发器定义.这样触发功能只能在实际使用时执行.我假设在这里,如果一个IS NULL,我们可以让b IS NULL幻灯片.

以与DEFAULT值相似但略有不同的方式工作.使用默认值,您可以显式地插入NULL以覆盖默认值.这是不可能的,NULL被替换为来自b的值.

猜你在找的Postgre SQL相关文章