PostgreSQL中的CASE语句

本文概述

  • 在本地设置PostgreSQL数据库
  • 非常简短地浏览国家表
  • PostgreSQL CASE简介
  • 编写PostgreSQL案例
  • 结论和进一步阅读
条件表达式是任何编程范例中最基本的元素之一。常见的条件表达式包括if-else块和切换条件。你可以在WPostgreSQL中使用WHEN-THEN大小写条件表达式, 这与if-else块非常相似。在本教程中, 你将学习如何执行此操作。
开始编写条件查询之前, 重要的是建立一个本地PostgreSQL数据库。你将在本教程的第一部分中进行此操作。
注意:为了能够跟随本教程的学习, 你需要了解SQL和PostgreSQL的基础知识。随时使用以下资源刷新基础知识:
  • PostgreSQL初学者指南
  • srcmini的SQL for Data Science简介
在本地设置PostgreSQL数据库 你可以使用此备份文件并将其还原到PostgreSQL服务器中。如果你想知道如何执行此操作, 可以阅读本文。成功还原备份后, 你应该能够在数据库中看到这些表-
  • 国家
  • route_table
  • station_table
  • train_table
但是, 本教程仅使用国家/地区表。随意浏览数据库备份中提供的表。另外, 你可能想要形成自己的数据库和表。如果你还原了数据库备份, 则现在应该有一张表(其中包含有关全球不同国家的详细信息)。现在让我们非常简要地浏览” 国家” 表。
非常简短地浏览国家表 恢复数据库后, 你可以在PostgreSQL的默认安装随附的pgAdmin界面中查看该表。运行简单的SELECT语句后, 你将了解列, 其数据类型以及表包含的行-
PostgreSQL中的CASE语句

文章图片
该表包含有关来自世界各地的206个不同国家的详细信息。到底有几个地区?以下查询将为你提供问题的答案。
SELECT COUNT(DISTINCT(region)) from countries;

事实证明, 此表涵盖了23个不同的区域, 例如西欧, 波利尼西亚, 中东等。你可以使用自己的快速问题来探索表格, 在此过程中, 你可能会发现有趣的事实。现在让我们看一下基本PostgreSQL案例的剖析。
PostgreSQL CASE简介 下面介绍了带有WHEN-THEN构造的PostgreSQL案例的一般形式-
CASE WHEN condition_1THEN result_1 WHEN condition_2THEN result_2 ... ELSEresult_n END

在PostgreSQL中构造CASE时, 应牢记以下关键点:
  • 每个条件都是一个布尔表达式, 并根据其输出选择结果。如果将与WHEN对应的所有表达式都评估为False, 则显示与ELSE部分相对应的结果。如果你没有指定ELSE部分, 查询将返回null。
  • 条件通常会应用于你要处理的表中存在的列。像上面这样的条件查询构造通常是使用SELECT语句完成的。请记住, 该列必须出现在查询的SELECT语句中, 在该语句中你要指定布尔表达式(在CASE中)。但是, 当你将CASE与where子句结合使用时, 则无需遵循此规则(稍后会对此进行详细介绍)。
  • 结果的数据类型必须统一。你不能在result_1中返回字符串, 而在result_2中返回整数, 依此类推。
现在让我们深入研究一些示例。
编写PostgreSQL案例 让我们开始简单。现在, 你将编写一个CASE来对独立年进行国家分组。独立年份记录在indep_year列中。假设你需要遵循三个国家的独立年。为此, 你将创建三组独立年-
  • 1900年之前(indep_year < 1900)
  • 1900年至1930年之间(indep_year < = 1930)
  • 1930年之后(印度年> 1930)
查询的最终结果应包含以下列-
  • 国家名称
  • 大陆(国家所属)
  • 独立年
  • 还有你将创建的独立年小组。让我们将其命名为indep_year_group。
现在让我们编写查询-
SELECT name, continent, indep_year, CASE WHEN indep_year < 1900 THEN 'before 1900' WHEN indep_year < = 1930 THEN 'between 1900 and 1930' ELSE 'after 1930' END AS indep_year_group FROM countries ORDER BY indep_year_group;

(该查询的灵感来自srcmini的SQL中的Joining Data课程。)
执行查询后, 你会看到许多国家(如巴勒斯坦, 波多黎各等)在表中未提供独立年。因此, 他们进入了1900年至1930年的小组。
PostgreSQL案例可以有多个条件。该表中有几个条目, 其中国家和首都的名称相同。你可以将其添加到以前构建的CASE中-
SELECT name, continent, indep_year, CASE WHEN (indep_year < 1900) AND (countries.name = countries.capital) THEN 'before 1900 and capital same' WHEN indep_year < = 1930 AND (countries.name = countries.capital) THEN 'between 1900 and 1930 and capital same' ELSE 'after 1930_and_no_same_capital' END AS indep_year_group FROM countries ORDER BY indep_year_group;

CASE的另一个令人兴奋的事情是, 你可以将它们与SUM()之类的聚合函数配对。要使用聚合函数SUM()实现CASE, 你将需要一个不同的表, 这可能是个好主意。让我们创建一个简单的表, 名称为student_grades, 该表具有以下列和数据类型-
  • student_name(字符串)
  • student_stream(字符串)
  • student_grade(字符)
以下查询为你创建表-
CREATE TABLE student_grades (student_name character varying, student_stream character varying, student_grade character);

现在将一些记录插入表中。你可以使用一些INSERT语句执行此操作。假设在插入之后, 表格student_grades现在具有以下记录-
PostgreSQL中的CASE语句

文章图片
现在, 你将编写一个CASE以获取属于某些年级组的学生的总和。如你所见, 根据表的实例, 存在三种不同的等级-A, B和C。条件查询应返回类似于以下内容的输出-
PostgreSQL中的CASE语句

文章图片
查询此-
SELECT SUM ( CASE WHEN student_grade = 'A' THEN 1 ELSE 0 END ) AS "High Scoring", SUM ( CASE WHEN student_grade = 'B' THEN 1 ELSE 0 END ) AS "Mid Scoring", SUM ( CASE WHEN student_grade = 'C' THEN 1 ELSE 0 END ) AS "Low Scoring" FROM student_grades;

这是将CASE与聚合函数配对以得出有关数据的有趣事实的方法。
结论和进一步阅读 这就是本教程的全部内容。在本教程中, 你学习了如何将if-then像条件那样合并到SQL查询中, 以生成有趣的报告。你通过几个示例来增强此技能。如果你正在寻找更具挑战性的练习, 则应该参加以下有关SQL的srcmini课程-
  • 中级SQL
  • 用于探索性数据分析的SQL
  • 用SQL报告
【PostgreSQL中的CASE语句】请随时通过” 评论” 部分告诉我有关本教程的问题。

    推荐阅读