在CASE表达式中使用between谓词

时间:2018-12-04 07:58:49

标签: sql postgresql case

我想根据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;

输出:

  

错误:“现在”或附近的语法错误

我该怎么做?这会带来更好的性能吗?

2 个答案:

答案 0 :(得分:4)

As documented in the manualcase 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编写它的方式。