在 PostgreSQL 中使用 CASE

Shihab Sikder 2024年2月16日
  1. 在 PostgreSQL 中如何使用 CASE 語句
  2. PostgreSQL 中 CASE 語句的一般示例
  3. 帶有聚合函式的 PostgreSQL CASE 語句
在 PostgreSQL 中使用 CASE

本文展示瞭如何在 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 中,我們可以使用 ANDOR 的組合來使用通常的條件。因此,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 表示式編寫更復雜的查詢。例如,我們希望將帳戶劃分為這樣的組,其中:

  1. 年齡 13-19 歲,身高 140-160 之間,就是 Teens with average height
  2. 年齡 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
Shihab Sikder avatar Shihab Sikder avatar

I'm Shihab Sikder, a professional Backend Developer with experience in problem-solving and content writing. Building secure, scalable, and reliable backend architecture is my motive. I'm working with two companies as a part-time backend engineer.

LinkedIn Website