我需要使用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。
提前致谢,问候,
答案 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中存在的一些数据库一样。我发现的是各种功能: