Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL特定顺序_Sql_Postgresql - Fatal编程技术网

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 before
true

这可以让您接近:或者有另一个“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来编写相同的查询,这很有意义,并给出了我想要的结果。感谢您的帮助和详细解释。