SQLZOO SELECT 来自诺贝尔#14

问题描述 投票:0回答:6

物理化学整理完之后不知道名字怎么排序了!

问题:表达式主语 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

问题的详细信息http://sqlzoo.net/wiki/SELECT_from_Nobel_Tutorial

sql select
6个回答
7
投票

我在 SQLZOO 中尝试过,下面的 SQL 给出了正确的结果。

SELECT winner, subject
FROM nobel
WHERE yr=1984
ORDER BY subject IN ('Physics','Chemistry'), subject, winner

2
投票

正如 @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

1
投票

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 不会。


1
投票
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

0
投票
SELECT 
        winner, 
        subject
 FROM 
        nobel
 WHERE 
        yr=1984
 ORDER BY 
        subject IN ('Physics','Chemistry'),
        subject,
        winner

-1
投票
## 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

它显示结果但不是正确答案。

© www.soinside.com 2019 - 2024. All rights reserved.