PostgreSQL bietet die Möglichkeit, bedingte Ausgaben einfach und effizient zu implementieren. Mit Hilfe von CASE / WHEN Konstrukten können einfache Prüfungen durchgeführt werden. Das folgende Listing zeigt ein einfaches Beispiel:
test=# SELECT id, name, CASE WHEN price < 10 THEN 'cheap' ELSE 'expensive' END FROM t_produkt; id | name | case ----+--------------+----------- 1 | Semmel | cheap 2 | Käsestangerl | cheap 3 | Kasten | expensive 4 | Rose | cheap 5 | Apfel | cheap (5 rows)
CASE / WHEN Konstrukte können auch innerhalb von Aggregate Functions verwendet werden:
test=# SELECT COUNT(CASE WHEN price < 10 THEN 'cheap' ELSE 'expensive' END)
FROM t_produkt;
count
-------
5
(1 row)
CASE / WHEN kann auch mit GROUP BY verwendet werden:
test=# SELECT CASE WHEN price < 10 THEN 'cheap' ELSE 'expensive' END AS x,
COUNT(*)
FROM t_produkt
GROUP BY x;
x | count
-----------+-------
expensive | 1
cheap | 4
(2 rows)
Bei der Verwendung von GROUP BY Statements ist zu bedenken, dass man in HAVING-Clauses keine Aliase verwenden darf;
test=# SELECT CASE WHEN price < 10 THEN 'cheap'
ELSE 'expensive' END AS x, COUNT(*)
FROM t_produkt
GROUP BY x
HAVING count > 1;
ERROR: column "count" does not exist
test=# SELECT CASE WHEN price < 10 THEN 'cheap'
ELSE 'expensive' END AS x, COUNT(*)
FROM t_produkt
GROUP BY x
HAVING (CASE WHEN price < 10 THEN 'cheap'
ELSE 'expensive' END) > 1;
x | count
-----------+-------
expensive | 1
cheap | 4
(2 rows)
Um dennoch CASE / WHEN verwenden zu können, müssen Sie die entsprechenden Teile der SELECT-Clause auch in der HAVING-Clause anführen.