在 MySQL 的选择查询中使用 CASE、WHEN、THEN、END

Posted

技术标签:

【中文标题】在 MySQL 的选择查询中使用 CASE、WHEN、THEN、END【英文标题】:Using CASE, WHEN, THEN, END in a select query with MySQL 【发布时间】:2011-08-05 02:44:12 【问题描述】:

我正在开发一个与棒球相关的网站。我有一张桌子,上面有两支棒球队的击球阵容:

+----+----------+--------------+--------+
| id | playerId | battingOrder | active |
+----+----------+--------------+--------+

击球顺序是1到20之间的整数,对应如下逻辑:

    击球顺序 1-9 - 客队阵容 击球顺序 10 - 客队投手 击球顺序 11-19 — 主队阵容 击球顺序 20 - 主队投手

active 字段是一个 tinyint 0 或 1,代表投手在土墩上,击球手在盘子上。

已知事实:总会有一名来自一支球队的现役投手和一名来自对方球队的现役击球手。

我需要编写一个查询,返回对应于 battingOrder 中 下一个 击球手的主队球员的行。 (发生在 活跃击球手的 battingOrder 之后的那个)

例子:

    如果 battingOrder 13 中的玩家处于活动状态,则查询应返回击球顺序为 14 的玩家。 如果 battingOrder 19 中的球员处于活动状态,则查询应返回击球顺序为 11 的球员(阵容循环回到球队的第一个球员)。

我以前从未使用过 CASE 查询,但我想出了以下内容:

SELECT *
  FROM lineups
 WHERE battingOrder = 
       CASE (
           SELECT battingOrder
             FROM lineups
            WHERE battingOrder > 10 AND active = 1
            LIMIT 1
       )
       WHEN 11 THEN 12
       WHEN 12 THEN 13
       WHEN 13 THEN 14
       WHEN 14 THEN 15
       WHEN 15 THEN 16
       WHEN 16 THEN 17
       WHEN 17 THEN 18
       WHEN 18 THEN 19
       WHEN 19 THEN 11
       END
 LIMIT 1;

这似乎可行,但我遇到了哪些极端情况和/或陷阱?这有效率吗?我对不使用嵌套查询的问题的解决方案特别感兴趣。

【问题讨论】:

【参考方案1】:
Select LNext.player As NextPlayer
From lineups As L
    Left Join lineups As LNext
        On LNext.BattingOrder Between 11 And 20
            And LNext.BattingOrder  = Case
                                        When L.BattingOrder  = 19 Then 11
                                        Else L.BattingOrder  + 1
                                        End
Where L.battingOrder Between 11 And 20
    And L.active = 1

事实上,你可以让它像这样处理家庭和外出:

Select LNext.player As NextPlayer
From lineups As L
    Left Join lineups As LNext
        On LNext.BattingOrder  = Case
                                    When L.BattingOrder  = 19 Then 11
                                    When L.BattingOrder  = 9 Then 1
                                    Else L.BattingOrder  + 1
                                    End
Where L.active = 1

【讨论】:

这似乎不对。为什么要查看 id 列?它应该是 battingOrder 列。 @Stephen - 是的。那是一个错字。固定。 好吧,我已经逐字使用了您的查询,但没有结果。我有一名处于击球顺序第 19 位的球员处于活动状态,但您的两个查询均未返回任何结果。 @Stephen - 你的意思是你有一个在 BO 位置 18 19 都活跃的球员? 好的,我目前在数据库中有一个玩家,其 battingOrder 为 19,Active 为 1。我的查询返回位置 11 的玩家(正确),而您的查询返回空结果集。

以上是关于在 MySQL 的选择查询中使用 CASE、WHEN、THEN、END的主要内容,如果未能解决你的问题,请参考以下文章

关于Hive中case when不准使用子查询的解决方法

java - mysql - 选择查询输出文件 - 文件保存在哪里

在另一个选择中选择案例

如何在 MySQL 中正确使用 CASE..WHEN

子查询中存在 CASE WHEN 的 SQL 中的奇怪行为(MySQL 5.5)

在MYSQL查询中使用CASE…WHEN语法重新映射值