postgresql - update,在case语句中设置DEFAULT

时间:2017-01-27 20:56:09

标签: sql postgresql

尝试将表更新为在case语句中使用DEFAULT关键字值时出现语法错误,如下所示:

UPDATE tbl
SET status =
     CASE
        WHEN ( st.status = '' ) THEN ( DEFAULT )
        ELSE ( ROUND( CAST(st.status as numeric) ) )
     END

FROM sourceTable st 

这是错误:

ERROR:  syntax error at or near "DEFAULT"
LINE 4: ...                  WHEN ( tc.status = '''' ) THEN ( DEFAULT )

暂时查看文档,我看不出这违反了任何语句构造规则。

以前的代码使用NULL确实有效

UPDATE tbl
SET status =
     CASE
        WHEN ( st.status = '' ) THEN ( NULL )
        ELSE ( ROUND( CAST(st.status as numeric) ) )
     END

FROM sourceTable st

我的目标是将列更新为默认值,如果源表列中有空字符串,则为NULL。

使用NULL工作正常但当然将列更新为NULL,并且我认为对DEFAULT的更改会起作用 - 任何人都可以帮助进行语法更正或替代吗?

这段代码是由处理不同场景中的各种列的东西生成的,因此不会寻找任何替代问题的方法(尽管我对任何响应都是开放的) - 只是在可能的情况下寻找修复,或者解释为什么语法不起作用。谢谢!

1 个答案:

答案 0 :(得分:3)

PostgreSQL documentation for UPDATE syntax似乎表示您可以将列设置为表达式或单词DEFAULT,但不能设置为包含关键字DEFAULT的表达式。

SET column_name = { expression | DEFAULT }

此语法参考意味着=的右侧可以是表达式,也可以是DEFAULT{ X | Y }的符号表示" X或Y,只选择一个。"

使用DEFAULT关键字的选择不会出现在documentation for value expressions中。 DEFAULT可以在INSERTUPDATE中用作特殊情况分配,但仅作为值表达式的替代,而不是更复杂表达式的一部分。

要解决这个问题,您可能必须从information_schema.columns.column_default读取相应表和列的列的DEFAULT值,然后在UPDATE语句中逐字使用该值。