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

使用字母和数字对varchar进行排序-PostgreSQL,postgresql,varchar,natural-sort,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 g

我有一个数据库,里面有我想订购的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

你们能帮帮我吗?

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

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

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

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