物理化学整理完之后不知道名字怎么排序了!
问题:表达式主语 IN ('Chemistry','Physics') 可以是 用作值 - 它将是 0 或 1。
按主题和获奖者姓名排序显示 1984 年获奖者和主题; 但最后列出化学和物理。
SELECT winner, subject, subject IN('Physics', 'Chemistry')
FROM nobel
WHERE yr=1984
ORDER BY CASE
WHEN subject IN ('Physics', 'Chemistry') = 0 THEN subject IN ('Physics', 'Chemistry')
WHEN subject IN ('Physics', 'Chemistry') = THEN winner
ELSE winner
End
我在 SQLZOO 中尝试过,下面的 SQL 给出了正确的结果。
SELECT winner, subject
FROM nobel
WHERE yr=1984
ORDER BY subject IN ('Physics','Chemistry'), subject, winner
正如 @AllenJohnson 指出的,这是由 SQL 引擎设置引起的。
SQLZOO使用其问题指南中的表达式,但没有指出SQL引擎会影响语法正确与否。
表达式 subject IN ('Chemistry','Physics') 可以用作一个值 - 它将是 0 或 1。
如果您选择 SQLZOO SQL 引擎作为 MySQL,您可以使用:
select
winner
, subject
from nobel
where yr=1984
order by
subject in ('Physics','Chemistry')
, subject
, winner
如果您选择 SQLZOO SQL 引擎作为 Microsoft SQL,您可以使用:
select
winner
, subject
from nobel
where yr = 1984
order by
case
when subject in ('Physics', 'Chemistry') then 1
else 0
end
, subject
, winner
in
运算符不能像您一样在选择中使用,但您在order by
子句中使用case表达式走在正确的道路上。你想要的是这样的:
SELECT
winner, subject
FROM
nobel
WHERE
yr = 1984
ORDER BY
CASE WHEN subject IN ('Physics','Chemistry') THEN 1 ELSE 0 END,
subject,
winner
正如问题所述,
IN ('Physics','Chemistry')
将计算为1或0,因此它可以用于某些数据库中的完整案例表达式;尽管它不符合标准 ANSI SQL。我相信 MySQL 会允许,但例如 MS SQL 不会。
select winner, subject
from nobel
where yr = '1984'
order by ( case subject
when 'Chemistry' then 1
when 'Physics' then 2
else 0
end), subject, winner
SELECT
winner,
subject
FROM
nobel
WHERE
yr=1984
ORDER BY
subject IN ('Physics','Chemistry'),
subject,
winner
## Heading ##SELECT *
From (Select Top (Select count(winner) from nobel where yr = 1984 AND subject NOT IN ('Chemistry', 'Physics')) winner, subject
FROM nobel
WHERE yr=1984 AND subject NOT IN ('Chemistry', 'Physics')
Order By subject, winner) AS zero
UNION
Select *
From (Select TOP (Select count(winner) from nobel where yr = 1984 AND subject IN ('Chemistry', 'Physics')) winner, subject
From nobel
Where yr = 1984 AND subject IN ('Chemistry', 'Physics')
Order By subject, winner) AS one
它显示结果但不是正确答案。