PostgreSQL按字母数字列排序:现有方案结果不符预期求修正
PostgreSQL 字母数字列正确排序方案
问题出在你未处理排序条件中的NULL值:不带括号的行(如AC-2),其括号内数字的提取结果为NULL,PostgreSQL默认将NULL排在所有非NULL值之后,导致AC-2被挤到了AC-2 (1)、AC-2 (2)后面。
修改后的排序语句如下:
ORDER BY SUBSTRING("COLUMN" FROM '[A-Z]+'), COALESCE(SUBSTRING("COLUMN" FROM '(?<=-)[0-9]+')::INTEGER, 0), COALESCE(SUBSTRING("COLUMN" FROM '(?<=\()[0-9]+')::BIGINT, 0)
关键修改说明:
- 给第三个排序项添加
COALESCE(..., 0),将括号内无数字的情况(即NULL)替换为0,这样不带括号的行(AC-2)会因为第三个排序键为0,排在带括号的行(键为1、2)之前。 - 使用双引号包裹
COLUMN,避免因关键字引发语法错误。
测试后排序结果会完全符合你的期望:
- AC-1
- AC-2
- AC-2 (1)
- AC-2 (2)
- AC-3 (1)
- AC-3 (2)
- AC-3 (3)
内容的提问来源于stack exchange,提问作者Mohit Deshwal
相关产品推荐
相关产品推荐

