簡體   English   中英

僅使用字符串的一部分對 postgres 中的記錄進行排序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM