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
Паоло Фалабелла

Відповіді:


145

Як зазначено в документах 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, але відповідь - це випадок з перемиканням.
Абель Каллехо

Привіт, Абель, у питанні було вирішено конкретну проблему. Відповідь стосується конкретної проблеми. У SELECTтвердженнях тутCASE описані умови, якими ви можете скористатися .
Джозеф Віктор Замміт

У цьому випадку буде більш зрозумілим, якщо ви додасте у відповідь причину, чому важче, або чому ви не можете досягти цього за допомогою твердження if-then.
Максиміліано Бесерра

2
@MaximilianoBecerra Готово. Будь ласка, погляньте. Дякуємо за вашу пропозицію.
Джозеф Віктор Замміт

ASІнструкція не є необхідною. Ви можете це зробитиEND field3
Пабло Вілас


1

Загалом, альтернативою case when ...є coalesce(nullif(x,bad_value),y)(що не може бути використана у випадку з ОП). Наприклад,

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і це відповідає рахунку
StephenBoesch
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.