PostgreSQL - 在case语句中使用set DEFAULT的update操作

3

当我尝试在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
列的默认值是什么?只需在 THEN ( default ) 中指定即可。 - Raul
如果 status 有一个 DEFAULT 值,那么它怎么会得到一个空值呢?代码中其他地方似乎有些奇怪。 - Gordon Linoff
空字符串在源表状态中。 - csdev
1个回答

4

PostgreSQL更新语法文档似乎表明,您可以将列设置为表达式或裸单词DEFAULT,但不能将包含关键字DEFAULT的表达式设置为列。

SET column_name = { expression | DEFAULT }

这个语法参考中,= 右侧可以是一个表达式,或者可以是 DEFAULT{ X | Y } 的表示方法意味着“X 或 Y,只能选一个”。

值表达式的文档 中并没有提到使用 DEFAULT 关键字的选择。 DEFAULT 可以作为特殊情况下的 INSERTUPDATE 赋值,但只能作为值表达式的替代,不能作为更复杂表达式的一部分。

要避免这种情况的发生,您可能需要从相应的表和列的 information_schema.columns.column_default 中读取列的 DEFAULT 值,然后直接在您的 UPDATE 语句中使用该值。


或者只需执行以下语句:update tbl set status = round(cast(status as numeric)) where status <> ''; update tbl set status = default where status = ''; - Abelisto
@Abelisto,不要啊!所有的SQL操作都必须在一条语句中完成!(开玩笑的) - Bill Karwin
谢谢,比尔-我知道你的意思并信任你的话-我标记了你的答案为正确-但我没有看到参考文档中的定义在语法上如何排除DEFAULT关键字成为左侧表达式的一部分,也没有找到更多有关DEFAULT关键字的详细信息(至少在我今天的搜索中)。 我会使用替代方案,你的方案或类似abelisto评论的内容来使其正常工作-如果有什么可以澄清的请随时指出,再次感谢。 - csdev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接