【问题标题】:Added condition to ORDER BY statement向 ORDER BY 语句添加条件
【发布时间】:2016-07-06 21:42:07
【问题描述】:

我在一个网站上发现了这个问题,并试图解决它无济于事。有一个诺贝尔奖获得者表,列有名称、年份和主题。问题是这样的: 显示按主题和获奖者姓名排序的 1984 年获奖者和主题;但最后列出化学和物理。

我想出了以下内容:

SELECT winner, subject
FROM nobel
WHERE yr=1984
ORDER BY CASE
WHEN subject NOT IN ('Chemistry','Physics') THEN 1
WHEN subject IN ('Chemistry','Physics') THEN 2
ELSE 3 END

给出结果:

winner               subject
Richard Stone        Economics
Jaroslav Seifert     Literature
Niels K. Jerne       Medicine
Georges J.F. Köhler Medicine
César Milstein      Medicine
Desmond Tutu         Peace
Bruce Merrifield     Chemistry
Carlo Rubbia         Physics
Simon van der Meer   Physics

但是,我要求每个科目的获奖者的顺序按姓名进一步排序,即上面的结果应该是 Caesar Milstein 的第三名,其次是 Georges J.K. Kahler,然后是 Niels K. Jerne。

【问题讨论】:

  • 只需将第二个订单条件添加到您的ORDER BYORDER BY CASE WHEN ......END, subject, winner
  • 正如这里的大多数人所指出的,将winner 添加到ORDER BY 子句应该可以解决这个问题。但是,我正在上述网站本身上运行查询;我猜(也许是错误的?)正是使用 MariaDB 导致了不同的输出。在任何情况下,将winner 添加到ORDER BY 会导致结果仅按winner 排序,而忽略subject 列。我发现这个问题的页面是这个 - sqlzoo.net/wiki/SELECT_from_Nobel_Tutorial - 问题号。 14,以防有人对来源感到好奇。
  • SQLZOO 似乎对SELECT winner, subject FROM nobel WHERE yr=1984 ORDER BY subject IN ('Physics','Chemistry'), subject, winner 很满意。请注意,SQL Server 不会将IN 视为返回01 的运算符,返回类型列为BOOLEAN。有一个boolean数据类型,但是你不能牢牢抓住一个:“与其他SQL Server数据类型不同,布尔数据类型不能指定为表列或变量的数据类型,并且不能在结果集。”
  • @HABO - 就是这样!有用。非常感谢。奇怪的是,CASE 的使用给出了错误的输出。只是为了澄清一下 - SQL Server 不会为给定的查询提供相同的输出?
  • 在 SQLZOO 中,您可以使用 SELECT winner, subject, subject IN ('Physics', 'Chemistry') FROM nobel WHERE yr=1984 ORDER BY subject IN ('Physics','Chemistry'), subject, winner 并输出带有 IN 子句结果的奇怪名称列。 SQL Server 只是有 Incorrect syntax near the keyword 'IN'. 来说明这一点。

标签: sql sql-server tsql sql-order-by


【解决方案1】:

只需通过声明将获胜者添加到您的订单中:-

SELECT winner, subject
FROM nobel
WHERE yr=1984
ORDER BY 
CASE
WHEN subject NOT IN ('Chemistry','Physics') THEN 1
WHEN subject IN ('Chemistry','Physics') THEN 2
ELSE 3 
END,
winner

【讨论】:

    【解决方案2】:

    当主题在 ('Chemistry', 'Physics') 然后 1 else 0 结束,获胜者,主题

    【讨论】:

      【解决方案3】:

      正如大家所提到的,您只需要添加,winner。但是你也可以简化一下:

      ORDER BY CASE WHEN subject NOT IN ('Chemistry','Physics') THEN 1 ELSE 2 END, winner
      

      【讨论】:

      • 如果 subject 可以是 NULL,则您的 CASE 在语义上是不同的,即 OP 的 CASE 将返回 3 以将 NULL 值放在列表末尾。
      • @HABO 谢谢,这是真的,值得注意。但由于 OP 没有以任何方式提及这一点,我发现他更有可能没有意识到他可以删除那条线,然后他正在考虑 NULL
      • subject 确实可以为空,但是为了这个问题,假设没有NULL 字段
      【解决方案4】:

      我认为这行得通

      SELECT winner, subject,CASE
      WHEN subject NOT IN ('Chemistry','Physics') THEN 1
      WHEN subject IN ('Chemistry','Physics') THEN 2
      ELSE 3 END ord
      FROM nobel
      WHERE yr=1984 
      ORDER BY ord,winner ASC
      

      【讨论】:

        【解决方案5】:

        感谢大家的帮助。但是,正如我在其中一个 cmets 中提到的,我测试这些查询的特定网站并没有为我提供此处发布的答案的输出。 HABO 在comment 中发布了有效的方法。

        【讨论】:

          猜你喜欢
          • 2014-06-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-11-28
          • 2011-04-02
          • 1970-01-01
          • 2013-06-21
          相关资源
          最近更新 更多