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 按字母顺序按点在前的主要内容,如果未能解决你的问题,请参考以下文章