Navicat 博客

在 WHERE 子句中使用 CASE 语句 2020 年 6 月 23 日,由 Robert Gravelle 撰写

不久前,我们介绍了非常有用且用途广泛的 CASE 语句。在那篇文章中,我们像大多数 DBA 和开发人员一样,在 SELECT 子句中使用了 CASE 语句。另一种方法是在 WHERE子句中使用。在那里,可以利用它基于条件来更改查询获取数据。在这种情况下,CASE 语句非常适合静态查询和动态查询,例如在存储过程中的查询。在今天的文章中,我们将在 Navicat Premium 中创建一个 SELECT 查询,该查询将根据另一个字段的值返回行。

按租借期列出电影

在进入 CASE 语句之前,让我们从一个查询开始,该查询该查询返回 Sakila 示例数据库中的电影列表。这是一个 MySQL 数据库,其中包含许多与虚构的视频租赁商店有关的表、视图和查询。表包括 actor、film、customer、rentals 等。

我们的查询显示电影 ID、标题、租金和租借期列,并将字段缩小到租借期为 5 天的电影。 这是语句:

SELECT film_id, title, rental_rate, rental_duration 
FROM film 
WHERE rental_duration = 5 
ORDER BY rental_rate DESC;

在 Navicat Premium 中执行查询将显示以下结果:

films_by_duration (106K)

根据租金设置租借期

使用 CASE 语句可以根据其他几个可能的值选择一个值。例如,假设我们要基于 rental_rate 设置 rental_duration,我们可以使用 CASE 语句来做到这一点,如下所示:

SELECT film_id, title, rental_rate, rental_duration 
FROM film 
WHERE rental_duration = CASE rental_rate
	                        WHEN 0.99 THEN 3
	                        WHEN 2.99 THEN 4
	                        WHEN 4.99 THEN 5
	                        ELSE 6
                        END 
ORDER BY title DESC;

这语句具有将 rental_rates 与 rental_durations 相关联的效果。因此:

  • 当 rental_rate 等于 0.99 时,仅包括 rental_duration 等于 3 的电影。
  • 当 rental_rate 等于 2.99 时,仅包括 rental_duration 等于 4 的电影。
  • 当 rental_rate 等于 4.99 时,仅包括 rental_duration 等于 5 的电影。
  • 任何其他 rental_rate 仅包括 rental_duration 等于 6 的电影。

我们可以在下面的屏幕截图中看到查询结果:

films_by_duration_using_case (145K)

请注意,每部电影的租金为 0.99 时,rental_duration 始终为 3。同样,租借价格为 2.99 的电影都具有 4 的 rental_duration,依此类推。

重写 CASE 语句

请记住,Case 语句仅是组合两个或多个 OR 条件的另一种方式。这样,我们可以不使用 Case 语句来重写查询,但是,正如你所看到的,它需要写更多的 SQL:

SELECT film_id, title, rental_rate, rental_duration 
FROM film 
WHERE rental_rate = 0.99 AND rental_duration = 3
  OR rental_rate = 2.99 AND rental_duration = 4
  OR rental_rate = 4.99 AND rental_duration = 5
  OR rental_rate NOT IN (0.99, 2.99, 4.99) AND rental_duration = 6
ORDER BY title DESC;

这是查询结果。将这结果与 CASE 查询的结果进行比较:

films_by_duration_using_or (163K)

总结

在今天的文章中,我们在 Navicat Premium 中创建了一个 SELECT 查询,该查询使用 WHERE 子句中的 CASE 语句返回电影列表。如果你对 Navicat Premium 感兴趣,可以免费试用14天!

Navicat 文章
频道条目
分享
文章归档