【发布时间】: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 BY:ORDER 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视为返回0或1的运算符,返回类型列为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