我有一些记录: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()失败的默认值?
答案 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)