【问题标题】:ORDER BY column = value desc|ascORDER BY 列 = 值 desc|asc
【发布时间】:2020-02-19 12:36:31
【问题描述】:

前段时间我发现了这段代码,但我似乎没有找到任何关于它的真正工作原理的解释:

SELECT account_id from accounts order by account_id = 100;

所以,我知道order by [column] desc|asc 对结果集做了什么。但我似乎没有找到为[column] 赋值以及它如何影响结果集的解释。它显然受到了影响,但我似乎没有找到规律。

【问题讨论】:

  • “account_id = 100”的行将排在最后,因为 true > false。

标签: sql postgresql sql-order-by


【解决方案1】:

尝试在ORDER BY 子句中使用显式CASE 表达式重写您的查询:

SELECT account_id
FROM accounts
ORDER BY CASE WHEN account_id = 100 THEN 1 ELSE 0 END;

您将观察到所有具有account_id != 100 的记录将出现在所有具有account_id != 100 的记录之前。使用时:

ORDER BY account_id = 100

然后您将按布尔相等本身进行排序。所以,当 not 为真时,它的计算结果为 0,而当为真时,它的计算结果为 1。

【讨论】:

  • 那么,基本上其他行会按照它们在表格中出现的顺序返回?并且只有具有 order by 子句中提到的值的行/行才会放在最后?
【解决方案2】:

Postgres 支持布尔类型,它有两个值“true”和“false”(当然还有NULL)。一个布尔值被用作order by 键。

对于 account_id 100,表达式 account_id = 100 的计算结果为“true”,对于其他人(或 NULL)计算结果为 false。

这是做什么的?那么,“true” > “false” 并且排序是升序的。因此,真实值排在所有其他值之后; account_id 100 放在最后。还没有结束。 NULL 值是最新的——它们会在最后。

更常见的是,这是通过降序完成的:

order by (account_id = 100) desc

这会将帐户 100放在列表的首位

注意:在这种情况下,我将表达式放在括号中以明确意图确实是按表达式排序。也就是说,没有错别字。

【讨论】:

    【解决方案3】:

    基本上ORDER BY有两种类型ASCDESC 默认为ASC

    举个例子

    SELECT * from Person
    ORDER BY Age DESC
    

    以上查询按降序返回人员年龄

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-09
      • 2011-04-22
      • 2019-06-09
      • 2012-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多