首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PostgreSQL中的字母数字排序

PostgreSQL中的字母数字排序
EN

Stack Overflow用户
提问于 2017-04-03 02:37:27
回答 2查看 5.3K关注 0票数 4

我在Postgres 9.6中有一个带有character varying列的表:

代码语言:javascript
复制
id | column 
------------
1  |IR ABC-1
2  |IR ABC-2
3  |IR ABC-10

我看到一些解决方案将列类型为bytea

代码语言:javascript
复制
select * from table order by column::bytea.

但它总是导致:

代码语言:javascript
复制
id | column 
------------
1  |IR ABC-1
2  |IR ABC-10
3  |IR ABC-2

我不知道为什么'10‘总是出现在'2’之前。我如何排序这个表,假设排序的基础是字符串的最后一个整数,而不管该数字之前的字符是什么。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-03 12:31:56

在对字符数据类型进行排序时,应用 rules --除非您使用按字节值对字符进行排序的地区"C“。适用校对规则可能是可取的,也可能是不可取的。这使得排序在任何情况下都更加昂贵。如果您想在没有排序规则的情况下进行排序,请不要强制转换为bytea,而是使用COLLATE "C"

代码语言:javascript
复制
SELECT * FROM table ORDER BY column COLLATE "C";

,但是,这还不能解决您提到的字符串中的数字问题。拆分字符串并将数字部分排序为数字。

代码语言:javascript
复制
SELECT *
FROM   table
ORDER  BY split_part(column, '-', 2)::numeric;

或者,如果您的所有数字都符合bigint,甚至integer,请使用它(更便宜)。

我忽略了主角,因为你写:

..。排序的基础是字符串的最后一个整数,而不管该数字之前的字符是什么。

相关信息:

通常,最好将字符串的不同部分保存在单独的列中,作为适当的相应数据类型,以避免任何这样的混淆。

如果前导字符串对所有列都是相同的,请考虑只删除冗余噪声。您可以始终使用VIEW来预置一个字符串以供显示,也可以在运行时廉价地进行.

票数 2
EN

Stack Overflow用户

发布于 2017-04-03 12:28:39

与注释中的注释一样,拆分和强制转换整数部分

代码语言:javascript
复制
select *
from
    table
    cross join lateral
    regexp_split_to_array(column, '-') r (a)
order by a[1], a[2]::integer
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43175737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档