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

时间:2010-11-02 18:15:24

标签: sql postgresql jdbc natural-sort

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

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

1
11
2
abc

但是,我需要获得:

1
2
11
abc

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

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

How do I sort a VARCHAR column in SQL server that contains words and numbers?

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

提前致谢,问候,

3 个答案:

答案 0 :(得分:6)

我遇到了同样的问题,以下代码解决了这个问题:

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

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

答案 1 :(得分:5)

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

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

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

如果正则表达式不匹配,请返回一个大数字,以便此行落在订单的底部。

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

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

答案 2 :(得分:1)

我不知道任何数据库具有“自然排序”,就像PHP中存在的一些数据库一样。我发现的是各种功能: