个性化阅读
专注于IT技术分析

PostgreSQL中的CASE语句

点击下载

本文概述

条件表达式是任何编程范例中最基本的元素之一。常见的条件表达式包括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语句1

该表包含有关来自世界各地的206个不同国家的详细信息。到底有几个地区?以下查询将为你提供问题的答案。

SELECT COUNT(DISTINCT(region)) from countries;

事实证明, 此表涵盖了23个不同的区域, 例如西欧, 波利尼西亚, 中东等。你可以使用自己的快速问题来探索表格, 在此过程中, 你可能会发现有趣的事实。现在让我们看一下基本PostgreSQL案例的剖析。

PostgreSQL CASE简介

下面介绍了带有WHEN-THEN构造的PostgreSQL案例的一般形式-

CASE
     WHEN condition_1  THEN result_1
     WHEN condition_2  THEN result_2
     ...
     ELSE  result_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语句2

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

PostgreSQL中的CASE语句3

查询此-

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报告

请随时通过”评论”部分告诉我有关本教程的问题。

赞(2)
未经允许不得转载:srcmini » PostgreSQL中的CASE语句

评论 抢沙发

评论前必须登录!