Использование предиката между в выражении CASE - PullRequest
0 голосов
/ 04 декабря 2018

Я хочу обновить 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 голосов
/ 04 декабря 2018

Ваш второй пример - синтаксическая ошибка в SQL.Первый пример - правильный запрос.При использовании CASE таким способом не снижается производительность, просто вы пишете его в SQL.

0 голосов
/ 04 декабря 2018

Как документировано в руководстве"простое" выражение случая (не "выражение") в форме case some_thing when ... только допускает условия равенства, когда столбец (фактически выражение)сравнивается с постоянным значением с помощью оператора =.

Таким образом, следующее:

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, вы не можете его использовать.


Производительность обеих версий должна быть одинаковой.По крайней мере, это будет незначительно по сравнению с работой, которую необходимо выполнить для обновления строк в таблице и записи этих изменений на диск.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...