SQL特定顺序
给出以下查询:SQL特定顺序,sql,postgresql,Sql,Postgresql,给出以下查询: 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 g
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的东西,但我似乎无法找到它的正确语法。谢谢您的帮助。是的,有一种方法可以做到这一点,正如您所想,您可以通过案例陈述来做到这一点。类似于以下内容的内容应该可以做到这一点:
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
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字段是什么,我们将为orderby分配一个整数。奥斯卡奖分配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
是的,有一种方法可以做到这一点,就像你所想的,你可以通过案例陈述来做到这一点。类似于以下内容的内容应该可以做到这一点:
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字段是什么,我们将为orderby分配一个整数。奥斯卡奖分配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
不需要
案例
子句
false
在true
之前的订单不需要案例
子句
false
orders beforetrue
这可以让您接近:或者有另一个“dictionary”表,使其更灵活,并按其属性排序ID@joeframbach:PostgreSQL!=MySQL和字段
是特定于MySQL的。Oops没有注意到。很抱歉这可以让你接近:或者有另一个“字典”表,使它更灵活,并按其顺序排列ID@joeframbach:PostgreSQL!=MySQL和字段
是特定于MySQL的。Oops没有注意到。很抱歉对于第三种和第四种情况,它们也会按字母顺序列出吗?如果是这样的话,这似乎正是我想要的。对于第三种和第四种情况,它们也会按字母顺序列出吗?如果是这样的话,这似乎正是我想要的。解释完全有道理,谢谢。但是,在尝试实现此操作时,我遇到了以下错误:“对于SELECT DISTINCT,ORDER BY表达式必须出现在SELECT列表中”似乎该错误表示在使用DISTINCT关键字时必须在SELECT查询中包含ORDER BY中的所有列。尝试将CASE语句作为列添加到SELECT子句中。我将更新答案以反映这一点。嗯,这似乎确实解决了问题,但确实在我的表中添加了一个额外的列,是否有办法避免这种情况?除了简单地将其作为子查询并从中进行选择之外,您可以尝试使用GROUPBY子句,而不是使用DISTINCT。让我用一个groupby来编写相同的查询,这很有意义,并给出了我想要的结果。谢谢你的帮助和详细的解释。解释完全有道理。谢谢。但是,在尝试实现此操作时,我遇到了以下错误:“对于SELECT DISTINCT,ORDER BY表达式必须出现在SELECT列表中”似乎该错误表示在使用DISTINCT关键字时必须在SELECT查询中包含ORDER BY中的所有列。尝试将CASE语句作为列添加到SELECT子句中。我将更新答案以反映这一点。嗯,这似乎确实解决了问题,但确实在我的表中添加了一个额外的列,是否有办法避免这种情况?除了简单地将其作为子查询并从中进行选择之外,您可以尝试使用GROUPBY子句,而不是使用DISTINCT。让我用一个groupby来编写相同的查询,这很有意义,并给出了我想要的结果。感谢您的帮助和详细解释。