2010-11-02 63 views
5

我需要使用数字和文本顺序使用varchar列排序选择查询。查询将在java程序中完成,使用jdbc over postgresql。如何对PostgreSQL中包含单词和数字的VARCHAR列进行排序?

如果我在SELECT子句中使用ORDER BY我获得:

1 
11 
2 
abc 

不过,我需要获得:

1 
2 
11 
abc 

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

这个问题是类似(但针对SQL服务器):

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

然而,提出的解决方案并没有在PostgreSQL工作。

在此先感谢,问候,

回答

6

我有同样的问题和下面的代码解决它:

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

大小var为varchar列的长度,e.g 255用于改变(255)。

+0

该解决方案奏效,谢谢。 – 2010-11-03 10:58:43

+1

请注意,这会在列的大小和顺序之间产生依赖关系,如果要更改列的大小,这将不会引起头部划伤。 – 2012-12-29 00:08:49

4

您可以使用正则表达式做这样的事情:

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

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

如果正则表达式不匹配,则返回一个大数字,以使该行落到该订单的底部。

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

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

+0

这是一个干净的解决方案。 – 2012-12-29 00:09:05

+0

就在您停止寻找最佳解决方案并决定解决方法时,您会发现正确的解决方案。 我的帽子是给你的先生,谢谢! – emptywalls 2015-08-30 20:47:02

相关问题