Heroku PostgreSQL 按字母顺序按点在前

Posted

技术标签:

【中文标题】Heroku PostgreSQL 按字母顺序按点在前【英文标题】:Heroku PostgreSQL alphabetical order by dot first 【发布时间】:2019-03-04 15:12:57 【问题描述】:

如何按字母顺序排列并获得结果在第一位

查询:

SQL SELECT name FROM article ORDER BY name;

**and the result is:**

GitFlow GithubFlow .gitignore 交出 增量迁移


...but I want to have `.gitignore` first.

**Expected result:**

.gitignore GitFlow GithubFlow 交出 增量迁移





**//update:**

**Correct query is:**
SQL
SELECT name FROM articles ORDER BY name::bytea;

来源:Incorrect sort/collation/order with spaces in Postgresql 9.4

...但我不知道为什么,你能解释一下吗?

//edit1:

我也需要先对其他非字母字符进行排序。 (例如 $-_# ...)

【问题讨论】:

可能是排序规则问题,出于兴趣,您为什么要将列转换为 bytea 数据类型? @Lucas 我发现了这个问题:***.com/questions/34537982/… 所以试试看。 您是否尝试过查询而不将其转换为 bytea? @Lucas 我当然试过了......正如你所看到的带有“查询”和“结果是”的段落......这是 PostgreSQL 在 Heroku 上的默认行为,我没有知道为什么。 :) 我问的是 Bytea,因为没有排序规则(排序规则),它是按字节值排序的,而“字符串”(我只能假设这是您要转换的列类型,排除枚举, json etc...) 将有一个排序规则,因此会出现奇怪的排序。解决问题需要理解它。 【参考方案1】:

我希望以下内容最能满足您的需求:

ORDER BY
   NOT starts_with(name, '.'),
   name COLLATE "C"

这将首先对“点文件”进行排序,因为 FALSE < TRUE,并且在这些组中,名称按二进制顺序排序(例如,大写字母在小写字母之前)。

我的COLLATE "C" 的效果与你的演员相同,只是更便宜。

您的查询(在某种程度上)实现了您想要的,因为. 的 ASCII 值小于所有字母的 ASCII 值。

如果您希望将名称按自然语言顺序排序(例如 albe < Simek),请删除我的答案中的 COLLATE 子句。

【讨论】:

但我也需要先对其他字符进行排序。例如。 “#、$、_、-”等 然后只需使用ORDER BY name COLLATE "C"。我认为圆点对你来说很特别。【参考方案2】:

使用

ORDER BY
  CASE
   WHEN SUBSTRING(name, 1, 1) = '.'
   THEN 1 
   ELSE 2
  END

感觉更“自然”。

已编辑

但我也需要先对其他字符进行排序。例如。 “#, $, _, -” 等等

那你可以试试。

ORDER BY
  CASE
   WHEN
        LOWER(SUBSTRING(name, 1, 1)) NOT BETWEEN 'a' AND 'z'
      AND
        SUBSTRING(name, 1, 1) NOT BETWEEN '0' AND '9'
   THEN 1 
   ELSE 2
  END

【讨论】:

但我也需要先对其他字符进行排序。例如。 “#、$、_、-”等 看来很有用! :) 这都是关于整理的?如何找到我的数据库和 Heroku 的数据库之间的差异以查看例如排序规则的区别? “我怎样才能找到我的数据库和 Heroku 的数据库之间的差异以查看例如排序规则的差异?”我会检查 information_schema 数据库视图,如 schemata 、 tables 和 columns 那里应该有字符集和排序规则信息。 “这都是关于排序的?”我也很确定 PostgreSQL 支持 ascii 子集的大多数排序规则(例如 UTF8 字符集确实支持 ascii 字符集)。因为 a-z, 0-9 被定义为 ascii 我相信这个查询应该适用于常用的字符集和排序规则@ ProkopSimek

以上是关于Heroku PostgreSQL 按字母顺序按点在前的主要内容,如果未能解决你的问题,请参考以下文章

按数字排序,带字母的数字,然后是字母 PostgresQL

使用没有字母参数的 Postgresql 的 Dapper 存储过程

在PostgreSQL中实现按拼音汉字拼音首字母搜索的例子

Firebase 根据日期按点排序

Java Split()方法按点(.)切分注意细节

如何使用 Pageable 在 Spring Boot 和 Thymeleaf 中显示按点赞数排序的技能列表?