[英]sort records in postgres using just a part of string
我有幾條記錄,我的一個字段是segment_number,它是:
PID_1
PID_2
PID_11
PID_14
PID_6
我想根據 segment_number 字段對所有記錄進行排序,但由於它是一個字符串並且數字位於字符串的末尾,因此我無法按數字的升序對其進行排序。
如果我使用 ORDER BY segment_number,我得到的訂單不是我想要的:
PID_1
PID_11
PID_14
PID_2
PID_6
我想要的是:
PID_1
PID_2
PID_6
PID_11
PID_14
任何線索將不勝感激。
這並不常見,但您可以使用regexp_replace
類的函數來提取數字並對其進行排序。
select
*
from
test
order by
regexp_replace(data, '.*_([0-9]+)', '\1')::int;
你需要數字排序。
一種選擇是將REGEXP_MATCHES()
與\d+
模式一起使用
SELECT col
FROM t
ORDER BY (REGEXP_MATCHES(col,'\d+'))[1]::INT
或REPLACE()
以消除前綴以及 integer 轉換,例如
SELECT *
FROM t
ORDER BY REPLACE(col,'PID_','')::INT
如果數據集在整個表中具有相同的模式
通過 substring 而不是正則表達式,這樣做要簡單得多:
postgres=# create table test(segment_number varchar(10));
CREATE TABLE
postgres=# insert into test values ('PID_1'),('PID_11'),('PID_14'),('PID_2'),('PID_6');
INSERT 0 5
postgres=# select segment_number from test order by substring(segment_number,5)::int;
segment_number
----------------
PID_1
PID_2
PID_6
PID_11
PID_14
(5 rows)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.