使用PostgreSQL进行字母数字排序
发布时间:2020-12-13 16:38:01 所属栏目:百科 来源:网络整理
导读:在数据库中,我有以下格式的各种字母数字字符串: 10_asdaasda100_inkskabsjd11_kancaascjas45_aksndsialcn22_dsdaskjca100_skdnascbka 我希望他们基本上按照字符串前面的数字排序,然后是字符串名称本身,但是当然,字符被逐一比较,因此按名称排序的结果会
在数据库中,我有以下格式的各种字母数字字符串:
10_asdaasda 100_inkskabsjd 11_kancaascjas 45_aksndsialcn 22_dsdaskjca 100_skdnascbka 我希望他们基本上按照字符串前面的数字排序,然后是字符串名称本身,但是当然,字符被逐一比较,因此按名称排序的结果会产生: 10_asdaasda 100_inkskabsjd 100_skdnascbka 11_kancaascjas 22_dsdaskjca 45_aksndsialcn 而不是我喜欢的订单: 10_asdaasda 11_kancaascjas 22_dsdaskjca 45_aksndsialcn 100_inkskabsjd 100_skdnascbka 老实说,如果字符串按照前面的数字排列,我会很好。我不太熟悉PostgreSQL,所以我不知道最好的方式是做什么。我会感谢任何帮助!
理想的方法是规范化数据并将列的两个组件分成两个单独的列。一种类型整数,一个文本。
使用当前的表,您可以执行如下所示的操作: WITH x(t) AS ( VALUES ('10_asdaasda'),('100_inkskabsjd'),('11_kancaascjas'),('45_aksndsialcn'),('22_dsdaskjca'),('100_skdnascbka') ) SELECT t FROM x ORDER BY (substring(t,'^[0-9]+'))::int -- cast to integer,substring(t,'[^0-9_].*$') -- works as text 可以使用相同的 正则表达式有些容错: >第一个正则表达式从左边选择最长的数字字符串,如果没有找到数字,则返回NULL,因此转换为整数不会出错。 如果下划线是明确的分隔符, ORDER BY (split_part(t,'_',1)::int,split_part(t,2) 回答你的例子 SELECT name FROM nametable ORDER BY (split_part(name,split_part(name,2) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |