Postgres对日期拼接字符串的concat结果排序机制是怎样的?
PostgreSQL 字符串排序逻辑说明
你执行排序的字段a是字符串(text/character varying)类型,而非时间类型,PostgreSQL 对这类字段的排序遵循以下规则:
- 默认按照数据库配置的排序规则(collation),从左到右逐字符对比ASCII/Unicode编码值的大小,直到出现第一个不同的字符,直接确定两个字符串的排序优先级,后续字符不再参与对比。
你的测试用例排序原因分析
你提供的三个字符串前19位均为固定格式的时间字符串YYYY-MM-DD HH:MM:SS,单独提取这部分的大小关系如下:
2021-10-18 11:12:15(对应后缀stack)2021-10-18 12:10:09(对应后缀boy)2021-10-18 15:12:09(对应后缀apple)
时间部分的大小关系已经完全确定了三个字符串的排序顺序,后缀apple/boy/stack在本次排序中完全没有参与对比,所以最终结果和时间升序的结果一致,和后缀的字母顺序无关。
如果需要验证后缀的排序逻辑,可以调整测试用例把三个字符串的时间部分改成完全一致,此时排序结果就会按照后缀的字母顺序排列:apple < boy < stack。如果你的业务需求是优先按照后缀排序、再按时间排序,可以使用字符串截取函数提取后缀后指定排序规则,示例:
with temp_table(a) as ( values ('2021-10-18 15:12:09apple'), ('2021-10-18 12:10:09boy'), ('2021-10-18 11:12:15stack') ) select * from temp_table order by substring(a from 20), a
内容的提问来源于stack exchange,提问作者Karanam Krishna
相关产品推荐
相关产品推荐

