2014-07-01 34 views
2

我有一个设置了默认值的列。一个UPDATE声明这样会按预期工作:在INSERT/UPDATE语句中使用DEFAULT与CASE

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; 

有没有一种有效的方法达到预期的结果?

+2

您的选择是一个表达式或魔术字'DEFAULT'。 'DEFAULT'不能出现在表达式中的任意位置。 –

+1

不可以。就像你不能按'按顺序排列顺序,然后按顺序排列'一样。它是语法的一部分,而不是函数 – Bohemian

+0

因此没有办法解决这个问题?我知道我可以明确地声明这个值,而不是使用'DEFAULT',但它不够好看。我也可以使用存储过程及其控制结构,但是对于简单更新来说不是一点点矫枉过正? – Przemek

回答

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可以与CASE表达式中的ELSE分支完全一样工作,因为如果使用多个修改CTE的数据,maximum one of them can affect every row表内。