是否可以在 postgreSQL 中按子字符串排序?

Is it possible to order by substrings in postgreSQL?

我有一个名为 widgets 的 table,它有一个名为 version.

的字符串列

版本数据采用句点分隔的字符串格式,类似于语义版本控制。例如“1.2.4”

当我执行传统的 ORDER BY widgets.version 时,我得到以下顺序

+--------------+
|    Widgets   |
+----+---------+
| id | version |
|----|---------|
| 1  | 1.3.2   |  <- This is fine
| 3  | 10.1.2  |  <- This should be last, since 10 > 4
| 2  | 4.5.7   |  <- This should be second, since 4 < 10
+----+---------+

如何更新我的查询,以便返回的顺序是版本 pt 1、版本 pt 2,然后是版本 pt 3?

最简单的方法是将版本字符串转换为整数数组,然后对该数组进行排序:

select id, 
       version
from widgets
order by string_to_array(version, '.')::int[]

请注意,如果版本包含非数字值,这将失败。

你试过了吗?

SELECT
  id,
  split_part(version, '.', 1)::int as major,
  split_part(version, '.', 2)::int as minor,
  split_part(version, '.', 3)::int as patch
FROM
  widgets
ORDER BY major, minor, patch

丑陋的 hack:转换为网络地址:(仅适用于小值、短字符串等)

SELECT * FROM widgets
ORDER BY version::cidr
        ;