是否可以在 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
;
我有一个名为 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
;