我需要使用varchar列、数字和文本顺序对select查询进行排序。查询将在java程序中完成,使用基于postgresql的jdbc。
如果我在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。
提前感谢,致以敬意,
发布于 2010-11-03 17:19:18
我也遇到了同样的问题,下面的代码解决了这个问题:
SELECT ...
FROM table
order by
CASE WHEN column < 'A'
THEN lpad(column, size, '0')
ELSE column
END;大小var是varchar列的长度,例如,对于varying( 255 ),为255。
发布于 2010-11-03 07:48:17
你可以使用正则表达式来做这样的事情:
select THECOL from ...
order by
case
when substring(THECOL from '^\d+$') is null then 9999
else cast(THECOL as integer)
end,
THECOL首先,使用正则表达式来检测列的内容是否为数字。在本例中,我使用了'^\d+$‘,但您可以根据情况修改它。
如果regexp不匹配,则返回一个较大的数字,这样该行将位于顺序的底部。
如果regexp匹配,则将字符串转换为number,然后对其进行排序。
在此之后,定期对列进行排序。
发布于 2010-11-03 02:18:15
我不知道有任何数据库具有“自然排序”,就像一些已知存在于PHP中的数据库一样。我所找到的是各种函数:
https://stackoverflow.com/questions/4080787
复制相似问题