在 PostgreSQL 中使用 CASE
本文展示了如何在 PostgreSQL 中使用 CASE
语句。
在 PostgreSQL 中如何使用 CASE
语句
case
语句类似于通用编程语言中的 if-else
。但是在 SQL 中,如果你想写 IF-ELSE
,你可能需要 PL/SQL
。
在 PostgreSQL 中,有使用 case
表达式的内置功能。
例如,假设你有以下数据库。
postgres=#\daccounts;Table"public.accounts"Column|Type|Collation|Nullable|Default-----------+-----------------------------+-----------+----------+-------------------------------------------
user_id|integer||notnull|nextval('accounts_user_id_seq'::regclass)username|charactervarying(50)||notnull|password|charactervarying(50)||notnull|email|charactervarying(255)||notnull|contact|charactervarying(20)|||postcode|integer|||age|integer|||height|integer|||timestamp|timestampwithouttimezone|||CURRENT_TIMESTAMPIndexes:"accounts_pkey"PRIMARYKEY,btree(user_id)"accounts_email_key"UNIQUECONSTRAINT,btree(email)"accounts_username_key"UNIQUECONSTRAINT,btree(username)
如果要创建上面的表,下面是 SQL 命令。
CREATETABLEaccounts(user_idserialPRIMARYKEY,usernameVARCHAR(50)UNIQUENOTNULL,passwordVARCHAR(50)NOTNULL,emailVARCHAR(255)UNIQUENOTNULL,contactVARCHAR(20),postcodeINT,ageINT,heightINT,timestamptimestampdefaultcurrent_timestamp);
之后,使用脚本填充表格;你可以使用插入
命令。
PostgreSQL 中 CASE
语句的一般示例
例如,你被要求根据高度来划分账户。如果身高小于 140 厘米,则为矮
;如果介于 140 和 160 之间,则平均
和 160 或更高将被标记为更高
。
PostgreSQL 的 case
表达式的一般结构如下所示。
SELECT<col1>...CASEWHEN<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 命令将在下面。
SELECTusername,email,height,CASEWHENheight<140THEN'SHORT'WHENheight>140ANDheight<160THEN'AVERAGE'ELSE'TALLER'ENDheight_groupFROMaccounts;
输出:
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 命令将如下所示。
SELECTSUM(CASEWHENage>=13ANDage<=19THEN1ELSE0END)AS"Teens with average height",SUM(CASEWHENage>=20ANDage<=40THEN1ELSE0END)AS"Adults with average height",COUNT(*)astotal_accountsFROMaccounts;
输出:
Teens with average height | Adults with average height | total_accounts
---------------------------+----------------------------+----------------
27 | 84 | 200
(1 row)
在每种情况下,如果满足条件,则返回 1,否则返回 0。然后聚合函数 SUM
将所有 1 或 true 条件相加。
Count(*)
对账户表中的总行进行计数。
这些类型的表达式将帮助你在将来构建自定义聚合函数,你可以在其中相应地放置你的条件。你可以从此处了解更多信息。
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布,任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站。本站所有源码与软件均为原作者提供,仅供学习和研究使用。如您对本站的相关版权有任何异议,或者认为侵犯了您的合法权益,请及时通知我们处理。