不久前,我们介绍了非常有用且用途广泛的 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 中执行查询将显示以下结果:
根据租金设置租借期
使用 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 的电影。
我们可以在下面的屏幕截图中看到查询结果:
请注意,每部电影的租金为 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 查询的结果进行比较:
总结
在今天的文章中,我们在 Navicat Premium 中创建了一个 SELECT 查询,该查询使用 WHERE 子句中的 CASE 语句返回电影列表。如果你对 Navicat Premium 感兴趣,可以免费试用14天!