IF-THEN-ELSE-Anweisungen in postgresql

83

Ich möchte eine postgresql-Abfrage schreiben, um Folgendes zu tun:

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

Ich habe diese Abfrage ausprobiert, aber sie funktioniert nicht

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

Danke dir

user2311028
quelle
Schauen Sie sich "bedingte Ausdrücke" (CASE) postgresql.org/docs/current/static/functions-conditional.html an
Paolo Falabella

Antworten:

143

Wie in den PostgreSQL-Dokumenten hier angegeben :

Der SQL CASE-Ausdruck ist ein generischer bedingter Ausdruck, ähnlich den if / else-Anweisungen in anderen Programmiersprachen.

Code-Snippet zur spezifischen Beantwortung Ihrer Frage:

SELECT field1, field2,
  CASE
    WHEN field1>0 THEN field2/field1
    ELSE 0
  END 
  AS field3
FROM test
Joseph Victor Zammit
quelle
7
Gab es aus Neugier keine Lösung mit der Wenn-Dann-Sonst-Anweisung? Die Frage wurde nach einem Wenn-Dann-Sonst gestellt, aber die Antwort ist eine Switch-Case-Anweisung.
Abel Callejo
Hallo Abel, die Frage nach der Lösung eines bestimmten Problems. Die Antwort befasst sich mit diesem spezifischen Problem. Innerhalb SELECTAussagen können die conditionals Sie verwenden, von denen eine CASE, dokumentiert hier .
Joseph Victor Zammit
In diesem Fall wird klarer, wenn Sie in der Antwort den Grund hinzufügen, warum dies schwieriger ist oder warum Sie dies mit der if-then-Anweisung nicht erreichen können.
Maximiliano Becerra
2
@ MaximilianoBecerra Fertig. Bitte schau es dir an. Danke für Ihren Vorschlag.
Joseph Victor Zammit
Die ASAnweisung ist nicht erforderlich. Sie können dies tunEND field3
Pablo Vilas
22
case when field1>0 then field2/field1 else 0 end as field3
Thanos Darkadakis
quelle
1

Im Allgemeinen ist eine Alternative zu case when ...ist coalesce(nullif(x,bad_value),y)(die nicht im OP Fall verwendet werden können). Zum Beispiel,

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

gibt:

 coalesce | coalesce |  x  |  y  
----------+----------+-----+-----
 abc      | abc      | abc | 
 ghi      | def      | def | ghi
 jkl      | jkl      |     | jkl
 mno      | mno      |     | mno
 pqr      | pqr      | pqr | 
(5 rows)
18446744073709551615
quelle
manchmal will ich nicht die Pracht von case whenund das passt zur Rechnung
javadba