我想根据target_column
的时间来更新column1
。我可以这样:
update table set target_column = case
when (column1 between now() and now() - interval '1 year') then 1.0
when (column1 between now() - interval '1 year' and now() - interval '2 years') then 2.0
else 3.0 end;
但是我不能这样:
update table set target_column = case column1
when (between now() and now() - interval '1 year') then 1.0
when (between now() - interval '1 year' and now() - interval '2 years') then 2.0
else 3.0 end;
输出:
错误:“现在”或附近的语法错误
我该怎么做?这会带来更好的性能吗?
答案 0 :(得分:4)
As documented in the manual以case some_thing when ...
only 形式的“简单”案例表达式(而非“ statement”)允许将列(实际上是表达式)与使用=
运算符的常量值。
以下内容:
case some_column
when 1 then 'one'
when 2 then 'two'
else 'Something else'
end
等效于:
case
when some_column = 1 then 'one'
when some_column = 2 then 'two'
else 'Something else'
end
“简单”表达式(case some_column when ...
)不支持其他任何内容。
如果要使用between
条件,则不能使用它。
两个版本的性能应该相同。至少与更新表中的行并将这些更改写入磁盘所需的工作相比,这可以忽略不计。
答案 1 :(得分:1)
第二个示例是SQL中的语法错误。第一个示例是正确的查询。以这种方式使用CASE不会降低性能,这就是您用SQL编写它的方式。