【问题标题】:Sort in non-alpabetical order in postgresql在 postgresql 中按非字母顺序排序
【发布时间】:2019-08-08 22:38:06
【问题描述】:

我正在自动化一个工作流程,其中输出需要按照特定的非字母顺序排列,具体取决于名称(internal_product,类型文本)以及数字(类型文本)。首先,我正在运行一个子查询,在其中我使用连接从四个略有不同的表中收集信息。然后,我在外部group by 对单位和金额求和之前附加union 的结果。伪查询如下:

select name, number, internal_product, sum(units), sum(amount) from (
 select fields, sum(x)
  from t1
  join join-conditions
  join join-conditions
  group by name, number, internal_product
 union

.....

 select fields, sum(x)
  from t5
  join join-conditions
  join join-conditions
  group by name, number, internal_product
) as foo
group by name, number, internal_product
order by number, name;

我试图将一个连接中使用的辅助表中的列更改为 enum 类型,因为它用于外部 group by (SO-thread) 但列类型当然需要是在连接条件中相同,因此修改后的查询无效。有 30 个产品名称,所以我想避免使用 gbn 和 Guffa 建议的CASE name

还有其他方法可以在order by 中应用特定顺序吗?

【问题讨论】:

  • 你应该提供更多关于你想要排序的值以及它们应该如何排序的信息。如果没有更多信息,CASE 语句是按特定值对项目进行排序的一般规则,但您可以创建一个字段,根据您的要求计算应按什么顺序排列,然后按此排序。
  • 我最终使用了 CASE-WHEN。

标签: postgresql enums group-by sql-order-by


【解决方案1】:

对于您的情况而言,这可能有点矫枉过正或复杂,但您可以在 postgres 中创建自定义排序规则以按照您想要的方式进行排序。看看文档。 https://www.postgresql.org/docs/11/collation.html

【讨论】:

  • 谢谢。这当然是一种选择。 :-)
  • 您只能使用操作系统或 ICU 排序规则。我认为您不能创建自定义排序规则。
  • 这太过分了,所以我最终使用了 CASE-WHEN。不过谢谢你的建议。
  • ICU排序规则可以自定义,但绝对不是小事。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-29
  • 1970-01-01
  • 2013-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多