在INSERT / UPDATE语句和CASE中使用DEFAULT

时间:2014-07-01 08:14:55

标签: sql postgresql

我有一个默认值设置的列。像这样的UPDATE语句将按预期工作:

UPDATE some_table SET
  some_column = DEFAULT
WHERE id = 1;

但是,当我尝试使用这样的条件时,我在DEFAULT附近出现语法错误:

UPDATE some_table SET
  some_column = CASE
    WHEN TRUE THEN DEFAULT
    ELSE 'foo'
  END
WHERE id = 1;

是否有实现预期结果的有效方法?

1 个答案:

答案 0 :(得分:2)

你做不到。您可以使用 DEFAULT关键字的表达式。

SET { column = { expression | DEFAULT } | ... }

但是,您可以将查询拆分为2个更新:

UPDATE some_table
SET some_column = DEFAULT
WHERE id = 1 AND some_condition;

UPDATE some_table
SET some_column = 'foo'
WHERE id = 1 AND NOT some_condition;

这将进行所需的更改。如果您确实想在一个查询中执行此操作,可以使用CTE s:

WITH upd1 AS (
  UPDATE some_table
  SET some_column = DEFAULT
  WHERE id = 1 AND some_condition
  RETURNING *
),
upd2 AS (
  UPDATE some_table
  SET some_column = 'foo'
  WHERE id = 1
  RETURNING *
)
SELECT * FROM upd1
UNION ALL
SELECT * FROM upd2

注意:故意跳过AND NOT some_condition。最后一个CTE可以与ELSE表达式中的CASE分支完全相同,因为如果您在表中使用多个数据修改CTE,maximum one of them can affect every row