如何对包含用句点分隔符分隔的字母数字字符的文本字段进行排序?

时间:2019-07-16 02:45:22

标签: postgresql-9.5

我需要以自然排序方式对字段进行排序,但是无法实现。有没有办法做到这一点?

这是用于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

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

不确定是否涵盖所有情况