1

给定以下查询:

SELECT DISTINCT n.iswinner, i.name 
  FROM nominees n, institutions i
  WHERE n.iid = i.iid and n.filmname = '127 Hours' 
  ORDER BY name

我得到输出:

iswinner    name

NULL    academy awards
NULL    baftas
NULL    critics' choice awards
NULL    golden globes
NULL    screen actors guild
NULL    writers guild of america

我试图弄清楚是否可以以更具体的方式订购此输出。我正在寻找的顺序是首先列出“学院奖”,然后是“金球奖”,然后是名称中带有“公会”的任何内容,最后按字母顺序列出其他任何内容。因此,我正在寻找的输出更像是这样的:

iswinner    name

NULL    academy awards
NULL    golden globes
NULL    screen actors guild
NULL    writers guild of america
NULL    bafta
NULL    critics' choice awards

有没有办法做这样的事情?我相信我应该使用 CASE 之类的东西,但我似乎无法找出正确的语法。谢谢你的帮助。

4

3 回答 3

3
order by
        case 
        when name = 'academy awards' then 1
        when name = 'golden globes' then 2
        when name like  '%guild%' then 3
        else 4
        end
,       name
于 2013-03-31T20:24:07.590 回答
3

是的,有一种方法可以做这样的事情,就像你想的那样,你可以用 CASE 语句来做到这一点。像下面这样的东西应该可以解决问题:

SELECT
    DISTINCT n.iswinner,
    i.name,
    CASE
        WHEN i.name = 'academy awards' THEN 1
        WHEN i.name = 'golden globes' THEN 2
        WHEN i.name like '%guild%' THEN 3
        ELSE 4
    END AS Order
FROM nominees n, institutions i
WHERE n.iid = i.iid and n.filmname = '127 Hours'
ORDER BY
    Order,
    i.name

所以,给你更多关于这里正在做的事情的信息。在 ORDER 子句中,我们按 CASE 语句排序。基本上,根据 i.name 字段是什么,我们分配一个整数来排序。学院奖​​被分配 1,金球奖被分配 2,任何包含“公会”的东西被分配 3,其他任何东西被分配 4。所以我们首先按此 CASE 语句(它给出了您想要的特定顺序)排序,然后按name 字段将满足您按名称订购其他任何东西的第二个要求(我们之前在 CASE 语句中为订购指定了值 4)。

我希望这对你有意义。

使用 GROUP BY 而不是 DISTINCT 的相同查询:

SELECT
    n.iswinner,
    i.name
FROM nominees n, institutions i
WHERE n.iid = i.iid and n.filmname = '127 Hours'
GROUP BY 
    n.iswinner,
    i.isname
ORDER BY
    CASE
        WHEN i.name = 'academy awards' THEN 1
        WHEN i.name = 'golden globes' THEN 2
        WHEN i.name like '%guild%' THEN 3
        ELSE 4
    END,
    i.name
于 2013-03-31T20:28:03.710 回答
1

不需要case条款。SQL小提琴

select *
from (
    select distinct n.iswinner, i.name
    from nominees n, institutions i
    where n.iid = i.iid and n.filmname = '127 Hours'
) s
order by
    name != 'academy awards',
    name != 'golden globes',
    name not like '%guild%',
    name

false之前的订单true

于 2013-03-31T23:07:34.493 回答