Postgresql的Order缺少值

时间:2019-06-13 04:29:14

标签: sql postgresql

我有一些记录:vu,vunh,vu123,vu12。我正在尝试对预期的输出进行自然排序,如下所示:

  

vu,vunh,vu12,vu123

这是我的查询

select "firstName" from organization_users where "organizationId"='23' order by substr("firstName",0,char_length("firstName")-char_length(array_to_string(regexp_matches("firstName",'(\d+)'),''))+1),CAST( array_to_string(regexp_matches("firstName",'(\d+)'),'') AS INTEGER);

但是我得到了输出:

  

vu12,vu123

。我发现没有数字部分的记录出了问题。有人知道为什么以及如何解决吗?

Ps:我自然地将其分为两部分:字母和数字,然后按顺序进行排序。

编辑1:我想知道是否有一种方法可以设置数字部分是否丢失,默认值是否等于0?还是regexp_matches()失败的默认值?

1 个答案:

答案 0 :(得分:0)

您应该避免在Order By子句中使用返回函数集。

改为使用regex_match

select "firstName" from organization_users 
order by substr("firstName",0,char_length("firstName")-char_length(array_to_string(regexp_match("firstName",'(\d+)'),''))+1),CAST( array_to_string(regexp_match("firstName",'(\d+)'),'') AS INTEGER);
 firstName
-----------
 vu12
 vu123
 vu
 vunh

话虽如此,您可以简化整个查询。仅提取非数字(\D+)或仅提取数字(\d+

select "firstName" 
from organization_users 
order by  substring("firstName", '(\D+)'),substring("firstName", '(\d+)')  NULLS FIRST;
 firstName
-----------
 vu
 vu12
 vu123
 vunh
(4 rows)