Операторы 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

Спасибо


посмотрите «условные выражения» (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
Пабло Вилас


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)

иногда я не хочу зрелищности, case whenи это отвечает всем требованиям
Стивен Бош
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.