Операторы IF-THEN-ELSE в postgresql

83

Я хочу написать запрос postgresql, чтобы сделать следующее:

if(field1 > 0,  field2 / field1 , 0)

Я пробовал этот запрос, но он не работает

if (field1 > 0)
then return field2 / field1 as field3
else return 0 as field3

Спасибо

user2311028
источник
посмотрите «условные выражения» (CASE) postgresql.org/docs/current/static/functions-conditional.html
Паоло Фалабелла

Ответы:

146

Как указано в документации PostgreSQL здесь :

Выражение SQL CASE - это общее условное выражение, подобное операторам if / else в других языках программирования.

Фрагмент кода, специально отвечающий на ваш вопрос:

SELECT field1, field2,
  CASE
    WHEN field1>0 THEN field2/field1
    ELSE 0
  END 
  AS field3
FROM test
Джозеф Виктор Заммит
источник
7
Из любопытства, не было ли решения с использованием оператора if-then-else? Вопрос задан для if-then-else, но ответ - оператор switch-case.
Abel Callejo
Привет, Абель, вопрос был задан для решения конкретной проблемы. Ответ касается этой конкретной проблемы. В SELECTзаявлениях условные вы можете использовать, одна из которых CASE, описаны здесь .
Джозеф Виктор Заммит
В этом случае будет более ясно, если вы добавите в ответ причину, почему это сложнее или почему вы не можете добиться этого с помощью оператора if-then.
Максимилиано Бесерра
2
@MaximilianoBecerra Готово. Пожалуйста, взгляните. Спасибо за ваше предложение.
Joseph Victor Zammit
ASИнструкция не является необходимой. Вы можете это сделатьEND field3
Пабло Вилас
22
case when field1>0 then field2/field1 else 0 end as field3
Танос Даркадакис
источник
2

В общем, альтернатива case when ...is coalesce(nullif(x,bad_value),y)(которая не может использоваться в случае OP). Например,

select coalesce(nullif(y,''),x), coalesce(nullif(x,''),y), *
from (     (select 'abc' as x, '' as y)
 union all (select 'def' as x, 'ghi' as y)
 union all (select '' as x, 'jkl' as y)
 union all (select null as x, 'mno' as y)
 union all (select 'pqr' as x, null as y)
) q

дает:

 coalesce | coalesce |  x  |  y  
----------+----------+-----+-----
 abc      | abc      | abc | 
 ghi      | def      | def | ghi
 jkl      | jkl      |     | jkl
 mno      | mno      |     | mno
 pqr      | pqr      | pqr | 
(5 rows)
18446744073709551615
источник
иногда я не хочу зрелищности, case whenи это отвечает всем требованиям
Стивен Бош