我有一条update语句,其中每个部分分别生成。理想的情况是产生这种情况:
UPDATE mytable
SET column1 = CASE WHEN ... THEN ... WHEN ... THEN ... WHEN ... THEN ... WHEN ... THEN ... ELSE ... END
...
WHERE ...
但是,我必须这样做:
UPDATE mytable
SET column1 = CASE WHEN ... THEN ... WHEN ... THEN ... ELSE ... END,
column1 = CASE WHEN ... THEN ... WHEN ... THEN ... ELSE ... END
...
WHERE ...
我尝试运行它,并且可以运行。
我想知道是否有陷阱或是否坚持到底。 p>
更新:WHEN ... THEN实际上包含与列相关的条件。例如WHEN column2 = ... THEN ...
例如
UPDATE mytable
SET column1 = CASE
WHEN column2 = 'a' THEN 'foo'
WHEN column2 = 'b' THEN 'bar'
ELSE null
END,
column1 = CASE
WHEN column2 = 'c' THEN 'foobar'
WHEN column2 = 'd' THEN 'barbar'
ELSE null
END
WHERE key = ...
答案 0 :(得分:1)
您试图同时为每行的column1字段提供两个不同的值。这确实没有任何逻辑意义,并且很可能导致意外或不良行为。不清楚
通过快速测试,我建议可能的结果是,如果column2
包含"foo"
或"bar"
,那么最终以column1
结尾的值将是NULL
(即第二条CASE语句生成的NULL
)。似乎SQL将评估第一个CASE语句,然后评估第二个CASE语句。因此,第二条语句返回的值将使用该语句的结果而不是第一条语句的结果覆盖字段中的值。实际上,这意味着第一个CASE语句是无用的。
这是该测试的有效演示:https://db-fiddle.com/f/foYWchffxkFkxtQuuRsDgC/1
这是一个细微的调整,用不同的值替换了NULL输出,因此您可以确切地看到行为是什么以及哪个子句生成最终值:https://db-fiddle.com/f/foYWchffxkFkxtQuuRsDgC/2。
但是我不确定这种情况下是偶然还是实际定义/记录的行为。这是我可重复的观察,仅此而已。
无论哪种方式,您实际上都必须修改您的代码,不能忍受这个不可靠的版本。
看来您已经知道答案了,但是为了清楚起见,这里是一个可靠的版本,它只尝试设置一次列值:
UPDATE mytable
SET column1 = CASE
WHEN column2 = 'a' THEN 'foo'
WHEN column2 = 'b' THEN 'bar'
WHEN column2 = 'c' THEN 'foobar'
WHEN column2 = 'd' THEN 'barbar'
ELSE null
END
WHERE key = ...