用字母和数字对varchar进行排序 - PostgreSQL

时间:2016-09-29 20:46:58

标签: postgresql varchar natural-sort

我有一个数据库,其中包含我要订购的varchar中的记录。目前,我使用以下查询按数字排序:

SELECT name
FROM table
ORDER BY 
NULLIF(regexp_replace(name, E'\\D', '', 'g'), '')::int

正确排序混合记录(数字+字母),但只有字母的记录未正确排序:

Query Results:
name:
1st guy
2nd guy
3rd guy
10th guy
11th guy
v guy
a guy
z guy
c guy

虽然我想要的结果是:

Query Results:
name:
1st guy
2nd guy
3rd guy
10th guy
11th guy
a guy
c guy
v guy
z guy

你们能帮助我吗?

1 个答案:

答案 0 :(得分:2)

没有数字的值都会导致ORDER BY的NULL值。这些行的顺序是未定义的,因为它们都具有相同的“值”以进行排序。您需要添加name列作为第二个排序条件。您可能还希望确保第一个表达式中的NULL值在结尾处排序:

ORDER BY NULLIF(regexp_replace(name, E'\\D', '', 'g'), '')::int NULLS LAST, name