PostgreSQL doesn't offer a number-aware collation that can do "humanized" sorts like "1A, 2A, 3A, ... 10A, 11A, ...". It relies on the operating system for collation, and I'm not aware of any OS that exposes such a collation to applications.
To do this, you need to split the text according to a pattern and order by the pattern parts, probably using regexp_matches
.
CREATE TABLE Table1 ("symbol" text);
INSERT INTO Table1 ("symbol") VALUES
('COL4A1'),('COL4A3'),('COL8A2'),('COL2A1'),
('COL12A1'),('COL12A1'),('COL16A1'),('COL19A1');
WITH matched(symbol, symbol_parts) AS (
SELECT symbol, regexp_matches(symbol, '(D*)(d+)(D+)(d+)')
FROM Table1
)
SELECT symbol
FROM matched
ORDER BY symbol_parts[1], symbol_parts[2]::integer,
symbol_parts[3], symbol_parts[4]::integer;
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…