Instrukcje IF-THEN-ELSE w postgresql

83

Chcę napisać zapytanie postgresql, aby wykonać następujące czynności:

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

Próbowałem tego zapytania, ale nie działa

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

Dziękuję

user2311028
źródło
spójrz na „wyrażenia warunkowe” (CASE) postgresql.org/docs/current/static/functions-conditional.html
Paolo Falabella

Odpowiedzi:

146

Jak stwierdzono w dokumentach PostgreSQL tutaj :

Wyrażenie SQL CASE jest ogólnym wyrażeniem warunkowym, podobnym do instrukcji if / else w innych językach programowania.

Fragment kodu odpowiadający konkretnie na Twoje pytanie:

SELECT field1, field2,
  CASE
    WHEN field1>0 THEN field2/field1
    ELSE 0
  END 
  AS field3
FROM test
Joseph Victor Zammit
źródło
7
Z ciekawości, czy nie było rozwiązania wykorzystującego instrukcję jeśli-to-jeszcze? Pytanie dotyczyło „jeśli-to-inaczej”, ale odpowiedzią jest instrukcja przełączająca.
Abel Callejo
Cześć Abel, pytanie zadane w celu rozwiązania konkretnego problemu. Odpowiedź dotyczy tego konkretnego problemu. W terminie SELECToświadczenia warunkowe można wykorzystać, z których jeden jest CASE, są udokumentowane tutaj .
Joseph Victor Zammit
W takim przypadku będzie to bardziej zrozumiałe, jeśli w odpowiedzi dodasz powód, dla którego jest to trudniejsze lub dlaczego nie możesz tego osiągnąć za pomocą stwierdzenia jeśli-to.
Maximiliano Becerra
2
@MaximilianoBecerra Gotowe. Proszę spójrz. Dzięki za Twoją sugestię.
Joseph Victor Zammit
ASInstrukcja nie jest konieczne. Możesz to zrobićEND field3
Pablo Vilas
22
case when field1>0 then field2/field1 else 0 end as field3
Thanos Darkadakis
źródło
2

Ogólnie rzecz biorąc, alternatywa dla case when ...jest coalesce(nullif(x,bad_value),y)(której nie można użyć w przypadku OP). Na przykład,

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

daje:

 coalesce | coalesce |  x  |  y  
----------+----------+-----+-----
 abc      | abc      | abc | 
 ghi      | def      | def | ghi
 jkl      | jkl      |     | jkl
 mno      | mno      |     | mno
 pqr      | pqr      | pqr | 
(5 rows)
18446744073709551615
źródło
czasami nie chcę widowiskowości case wheni to pasuje do rachunku
StephenBoesch