我需要以自然排序方式对字段进行排序,但是无法实现。有没有办法做到这一点?
这是用于PostgreSQL代码修复的,并尝试了各种代码段,但没有一个代码段返回预期的行
-PostgresSQL 9.5代码
SELECT name
FROM (
SELECT lower('1.1.1.a.1') as name union all
SELECT lower('1.1.a.1') as name union all
SELECT lower('1.1.1.a.11') as name
) folders
ORDER BY
COALESCE(SUBSTRING(name FROM '^(\\d+)')::INTEGER, 99999999),
SUBSTRING(name FROM '^\\d* *(.*?)( \\d+)?$'),
COALESCE(SUBSTRING(name FROM ' (\\d+)$')::INTEGER, 0),
name;
我希望输出按照以下顺序进行排序
Expected Output:
================
1.1.a.1
1.1.1.a.1
1.1.1.a.11
Actual (current) Output:
========================
1.1.1.a.1
1.1.1.a.11
1.1.a.1
答案 0 :(得分:0)
您可以先按长度排序,然后再根据元素创建的数组进行排序:
SELECT name
FROM (
values
('1.1.1.a.1'), ('1.1.a.1'), ('1.1.1.a.11'), ('1.1.1.a.2')
) folders (name)
ORDER BY length(name), string_to_array(name, '.');
返回
name
----------
1.1.a.1
1.1.1.a.1
1.1.1.a.2
1.1.1.a.11
不确定是否涵盖所有情况