【问题标题】:(combine CASE and UPDATE statements) UPSERT in Amazon Redshift(结合 CASE 和 UPDATE 语句)Amazon Redshift 中的 UPSERT
【发布时间】:2025-11-26 18:10:01
【问题描述】:

我知道 Azure 可以结合 IF x THEN UPDATE ELSE INSERT,是否可以用 Redshift SQL 做同样的事情?

我目前正在尝试此代码:

SELECT source,
CASE WHEN (SELECT 1 FROM state WHERE name = 
'out_dev' AND environment = 'dev') > 0
THEN
(UPDATE state SET source='new source')
ELSE (
INSERT state (source, name, load_time, hash, environment)
VALUES ('test', 'out_dev', '2017-10-12 01:14:38', '"f324f873b05d0792a3192bc28f466835"', 'dev'))
END
FROM state

这会返回错误:

[Amazon](500310) Invalid operation: syntax error at or near "state" 

Position: 132;

(UPDATE state SET source='new source')

我是 Redshift 的新手,如果我没有看到明显的内容,请见谅。

【问题讨论】:

  • 这不是插入和更新的工作方式。为什么这被标记为天蓝色?您不能在这样的子查询中使用插入和更新。阅读有关更新和插入的 redshift/postgres 文档。

标签: if-statement sql-update amazon-redshift sql-insert


【解决方案1】:

要回答您的第一个问题,Redshift SQL 没有像“If - Then - Else”这样的流控制语句,因此您尝试这样做是不可能的。

对于您的具体示例,尚不清楚您要实现的目标,但是如果您想有条件地插入“测试”行(如果它不存在),那么您可以执行以下操作:

INSERT INTO state (source, name, load_time, hash, environment)
SELECT 
  'test', 
  'out_dev', 
  '2017-10-12 01:14:38', 
  '"f324f873b05d0792a3192bc28f466835"', 
  'dev'
WHERE NOT EXISTS 
  (
   SELECT 1 FROM state 
   WHERE name = 'out_dev' AND environment = 'dev'
  )
;

【讨论】: