在 PostgreSQL 中使用 CASE
Shihab Sikder
2024年2月16日
本文展示瞭如何在 PostgreSQL 中使用 CASE
語句。
在 PostgreSQL 中如何使用 CASE
語句
case
語句類似於通用程式語言中的 if-else
。但是在 SQL 中,如果你想寫 IF-ELSE
,你可能需要 PL/SQL
。
在 PostgreSQL 中,有使用 case
表示式的內建功能。
例如,假設你有以下資料庫。
postgres=# \d accounts;
Table "public.accounts"
Column | Type | Collation | Nullable | Default
-----------+-----------------------------+-----------+----------+-------------------------------------------
user_id | integer | | not null | nextval('accounts_user_id_seq'::regclass)
username | character varying(50) | | not null |
password | character varying(50) | | not null |
email | character varying(255) | | not null |
contact | character varying(20) | | |
postcode | integer | | |
age | integer | | |
height | integer | | |
timestamp | timestamp without time zone | | | CURRENT_TIMESTAMP
Indexes:
"accounts_pkey" PRIMARY KEY, btree (user_id)
"accounts_email_key" UNIQUE CONSTRAINT, btree (email)
"accounts_username_key" UNIQUE CONSTRAINT, btree (username)
如果要建立上面的表,下面是 SQL 命令。
CREATE TABLE accounts (
user_id serial PRIMARY KEY,
username VARCHAR ( 50 ) UNIQUE NOT NULL,
password VARCHAR ( 50 ) NOT NULL,
email VARCHAR ( 255 ) UNIQUE NOT NULL,
contact VARCHAR (20),
postcode INT,
age INT,
height INT,
timestamp timestamp default current_timestamp
);
之後,使用指令碼填充表格;你可以使用插入
命令。
PostgreSQL 中 CASE
語句的一般示例
例如,你被要求根據高度來劃分賬戶。如果身高小於 140 釐米,則為矮
;如果介於 140 和 160 之間,則平均
和 160 或更高將被標記為更高
。
PostgreSQL 的 case
表示式的一般結構如下所示。
SELECT <col1>...
CASE
WHEN <condition_1> THEN <result_1>
WHEN <condition_2> THEN <result_2>
....
...
WHEN <condition> THEN <result>
ELSE <else_result>
END <column_name_of_result>
FROM <table_name>
在 WHEN
中,我們可以使用 AND
和 OR
的組合來使用通常的條件。因此,SQL 命令將在下面。
SELECT username, email, height,
CASE
WHEN height < 140 THEN 'SHORT'
WHEN height >140 AND height<160 THEN 'AVERAGE'
ELSE 'TALLER'
END height_group
FROM accounts;
輸出:
username | email | height | height_group
----------+------------------+--------+--------------
RNYAvQR | xgsgla@gmail.com | 150 | AVERAGE
djIlNbP | gfrqiy@gmail.com | 188 | TALLER
vKUEtyK | lffemk@gmail.com | 160 | TALLER
OkGRtRA | niwjri@gmail.com | 190 | TALLER
jRnoRDI | kofdcl@gmail.com | 163 | TALLER
czkarSx | qbqhyh@gmail.com | 186 | TALLER
GGFcCrz | tcbkip@gmail.com | 193 | TALLER
cfVgeZE | vpodqb@gmail.com | 161 | TALLER
XRivfYx | ldnnfg@gmail.com | 134 | SHORT
WUKNQYe | kvirum@gmail.com | 200 | TALLER
lwQODTo | apqvgc@gmail.com | 160 | TALLER
eYyvVNu | tsrioo@gmail.com | 190 | TALLER
CLFFGcF | nlpiuu@gmail.com | 131 | SHORT
VhxqxTl | hwrzao@gmail.com | 173 | TALLER
---- more ---
帶有聚合函式的 PostgreSQL CASE
語句
我們還可以使用 CASE
表示式編寫更復雜的查詢。例如,我們希望將帳戶劃分為這樣的組,其中:
- 年齡 13-19 歲,身高 140-160 之間,就是
Teens with average height
。 - 年齡 20-40 歲,身高 165-175 之間,就是
Adults with average height
。
我們要計算這兩個類別下的帳戶總數。SQL 命令將如下所示。
SELECT
SUM(
CASE
WHEN age>=13 AND age<=19 THEN 1
ELSE 0
END
) AS "Teens with average height",
SUM(
CASE
WHEN age>=20 AND age<=40 THEN 1
ELSE 0
END
) AS "Adults with average height",
COUNT(*) as total_accounts
FROM
accounts;
輸出:
Teens with average height | Adults with average height | total_accounts
---------------------------+----------------------------+----------------
27 | 84 | 200
(1 row)
在每種情況下,如果滿足條件,則返回 1,否則返回 0。然後聚合函式 SUM
將所有 1 或 true 條件相加。
Count(*)
對賬戶表中的總行進行計數。
這些型別的表示式將幫助你在將來構建自定義聚合函式,你可以在其中相應地放置你的條件。你可以從此處瞭解更多資訊。
作者: Shihab Sikder