我有一个默认值设置的列。像这样的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;
是否有实现预期结果的有效方法?
答案 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。