Working with Conditional Expressions
1. Using CASE Expression
SELECT id,
CASE WHEN total_cents >= 10000 THEN 'large'
WHEN total_cents >= 1000 THEN 'medium'
ELSE 'small' END AS bucket
FROM orders;
| Form | Syntax |
|---|---|
| Searched | CASE WHEN cond THEN ... END |
| Simple | CASE x WHEN 1 THEN 'a' ELSE 'b' END |
2. Using Simple CASE Expression
SELECT id,
CASE status WHEN 'new' THEN 0
WHEN 'paid' THEN 1
WHEN 'shipped' THEN 2
ELSE -1 END AS status_code
FROM orders;
3. Using CASE in SELECT Clause
SELECT count(*) FILTER (WHERE status='paid') AS paid_count,
sum(CASE WHEN status='paid' THEN total_cents ELSE 0 END) AS paid_revenue
FROM orders;
4. Using CASE in WHERE Clause
SELECT * FROM orders
WHERE CASE WHEN :role = 'admin' THEN true
ELSE customer_id = :uid END;
5. Using CASE in ORDER BY
SELECT * FROM orders
ORDER BY CASE status WHEN 'new' THEN 1 WHEN 'paid' THEN 2 ELSE 3 END,
placed_at DESC;
6. Using COALESCE Function
SELECT id, COALESCE(nickname, full_name, 'Anonymous') AS display_name FROM users;
| Property | Detail |
|---|---|
| Returns | First non-NULL argument |
| Short-circuit | Yes |
7. Using NULLIF Function
SELECT a / NULLIF(b, 0) FROM ratios; -- avoids divide-by-zero
Note:
NULLIF(x, y) returns NULL if x = y, else x.8. Using GREATEST Function
SELECT GREATEST(a, b, c) FROM nums;
-- NULL inputs are ignored
9. Using LEAST Function
SELECT LEAST(price, list_price, sale_price) AS min_price FROM products;
10. Using Boolean Expressions
| Expr | Result Type |
|---|---|
| a AND b | boolean (three-valued) |
| a OR b | boolean |
| NOT a | boolean |
| a BETWEEN x AND y | boolean |
11. Using IS TRUE, IS FALSE, IS UNKNOWN
SELECT * FROM flags WHERE active IS TRUE; -- excludes NULL
SELECT * FROM flags WHERE active IS NOT TRUE; -- false or NULL
SELECT * FROM flags WHERE complete IS UNKNOWN; -- NULL only
Note: Boolean predicate
IS NULL ≡ IS UNKNOWN; these forms return strict booleans (never NULL) suitable for indexes.