当前位置: 首页 > 面试题库 >

PostgreSQL:按列排序,具有特定的NON-NULL值LAST

葛修真
2023-03-14
问题内容

当我发现时NULLS LAST,我有点希望它可以CASEORDER BY查询部分的语句中泛化为“ X LAST” 。

事实并非如此。

我正在尝试按两列对表进行排序(简单),但是以特定的顺序(简单)获得输出,其中 一个特定值的一列最后出现 (完成它……很丑)。

假设这些列是zone并且status(不要怪我命名列zone-我没有给它们命名)。status仅采用2个值(“ U”和“
S”),而zone可以采用约100个值中的任何一个。

zone的值的一个子集是(在伪正则表达式中)IN[0-7]Z,而这些值在结果中排​​在第一位。使用可以很容易地做到这一点CASE

zone 也可以采用值’Future’,该值应在结果中显示为LAST。

以我典型的kludgy-munge方式,我简单地将CASE值设置为1000,如下所示:

group by zone, status
order by (
 case when zone='IN1Z' then 1
      when zone='IN2Z' then 2
      when zone='IN3Z' then 3
        .
        . -- other IN[X]Z etc
        .
      when zone = 'Future' then 1000
      else 11 -- [number of defined cases +1]
      end), zone, status

这行得通,但显然很麻烦,我想知道是否可能有一个班轮做同样的事情。
有没有更清洁的方法来达到相同的结果?


问题答案:

Postgres允许booleanORDER BY子句中使用值,因此这是您的generalised 'X LAST'

ORDER BY (my_column = 'X')

表达式的计算结果为boolean,结果值按以下方式排序:

FALSE (0)
TRUE (1)
NULL

由于我们处理非null值,这就是我们所需要的。这是您的一线客:

...
ORDER BY (zone = 'Future'), zone, status;


 类似资料:
  • 问题内容: 如何在PostgreSQL中定义一列,以使每个值都必须按顺序排列,而不是使用类型时获得的顺序,而不能使值2插入,除非该列中已存在值1才能插入该值? 问题答案: 从理论上讲,您可以使用像这样工作的约束。(但是实际上它是行不通的。) 计算行数。 评估。 比较结果。 在创建CHECK约束之前,您可能必须插入一行。如果您不这样做,则max(column)将返回NULL。一排 计算行数(1)。

  • 问题内容: 在Rails 3.2中,是否有任何便捷的方法通过将具有特定字段的特定值的记录移动到关系的前面来订购ActiveRecord关系?例如,如果有一个attribute ,我想对任何查询返回的关系进行排序,其中记录必须位于该关系的前面。 问题答案: 这样的事情。显然,“名称,ID”将取决于您的型号和要求。

  • 问题内容: 是否可以使用预定义的一组列值(ID)按“ order by”在mysql中排序,例如:order by(ID = 1,5,4,3),因此我会在其中得到记录1、5、4、3订购吗? 更新: 关于滥用mysql ;-)我必须解释为什么我需要这个… 我希望记录每5分钟随机更改一次。我有一个cron任务来执行更新表,以在其中放置不同的随机排序顺序。只有一个问题!分页。我将有一位访问者来到我的页面

  • 问题内容: 我需要按日期/时间字段(例如)升序对PostgreSQL表进行排序last_updated。 但是,该字段允许为空或空,我想与空记录之前,非空。 这可能吗? 问题答案: 为该ORDER BY子句提供了关键字,以完全满足该需求: 一个典型的用例是使用降序排序(DESC),它会生成默认的升序(ASC)的完整反转,首先是空值。通常不理想-因此,将null值保持在最后: 要支持带有索引的查询,

  • 我想编写一个简单的查询来选择PostgreSQL中的许多列。但是,我一直收到错误-我尝试了几个选项,但它们对我不起作用。目前我收到以下错误: 组织。postgresql。util。PSQLException:错误:“列”处或附近出现语法错误 要获取具有值的列,请尝试以下操作: 有什么想法吗?

  • 问题内容: 我有一个包含3列的表格: 我想使用以下顺序来排序结果集,但首先要优先考虑那些具有较低优先级的行。结果应如下所示 问题答案: 还有MySQL 函数。 如果要对所有可能的值进行完整排序: 如果您只关心“核心”在前,而其他值则无关紧要: 如果要先按“核心”排序,然后按正常排序顺序按其他字段排序: 不过,这里有一些警告: 首先,我很确定这是仅mysql的功能-问题被标记为mysql,但您永远不