如何在PostgreSQL中对包含单词和数字的VARCHAR列进行排序?

Ang*_*zon 6 sql postgresql jdbc natural-sort

我需要使用varchar列来命令选择查询,使用数字和文本顺序.查询将在java程序中完成,使用jdbc over postgresql.

如果我ORDER BY在select子句中使用,我会得到:

1
11
2
abc
Run Code Online (Sandbox Code Playgroud)

但是,我需要获得:

1
2
11
abc
Run Code Online (Sandbox Code Playgroud)

问题是该列还可以包含文本.

这个问题类似(但针对SQL Server):

如何在SQL Server中对包含单词和数字的VARCHAR列进行排序?

但是,提出的解决方案不适用于PostgreSQL.

在此先感谢,问候,

小智 6

我有同样的问题,以下代码解决了它:

SELECT ...
  FROM table
  order by  
    CASE WHEN column < 'A' 
        THEN lpad(column, size, '0')
    ELSE column 
        END;
Run Code Online (Sandbox Code Playgroud)

size var是varchar列的长度,例如255,用于变化(255).


End*_*ono 5

您可以使用正则表达式来执行此类操作:

select THECOL from ...
order by
  case
    when substring(THECOL from '^\d+$') is null then 9999
    else cast(THECOL as integer)
  end,
  THECOL
Run Code Online (Sandbox Code Playgroud)

首先,使用正则表达式来检测列的内容是否为数字.在这种情况下,我使用'^\d + $',但你可以修改它以适应这种情况.

如果正则表达式不匹配,则返回一个大数字,这样该行将落在订单的底部.

如果正则表达式匹配,则将字符串转换为数字,然后对其进行排序.

在此之后,定期对列进行排序.