sql - 在 INSERT/UPDATE 语句中使用 DEFAULT 与 CASE

标签 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;

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

最佳答案

你不能那样做。您可以使用表达式DEFAULT关键字。

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

However, you can split your query into 2 updates:

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在一个表中。

关于sql - 在 INSERT/UPDATE 语句中使用 DEFAULT 与 CASE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24505440/

相关文章:

python - Pyspark SQL 查询以获取特定列的 +/- 20% 的行

sql - 实现关系数据模型: what are the constraints for this table?

postgresql - 连接 2 个表,其中两组数字在连接列中重叠

sql - 如何选择显示自上次出现特定谓词以来的天数的行?

MySQL - 查询输出合并数据

mysql - 将 MSSQL DDL 转换为 MySQL DDL

django - postgres 不启动。 (涉及到 Django 和 Docker)

java - Postgresql:在表创建期间分配默认时区

regex - 如何将正则表达式与任何数组运算符一起使用

c# - 如何使用 LINQ to SQL/ADO.NET 获取执行计划