2012-01-20 31 views
7

我有一个只有数字字符串的名称(varchar)字段的表,我想按此字段排序查询。但名称字段按字母顺序排列,但我希望它们按数字排序。 例如,如果我得到1 2 200 100作为名称字段的值,它被排序为1 100 2 200 ,但我需要它们为1 2 100 200.由django(postgres后端)中的数字字符串排序查询结果

我可以拿出以下行查询

select * 
from my_table as t 
where t.foo='bar' 
order by cast(t.name as integer); 

但是不能把这个表示成django orm querysets?有没有办法做到这一点?

回答

10

我会问首先为什么你有一个需要被视为数字的varchar列,但没关系。

可以使用extra查询集方法将字符串转换:

MyTable.objects.extra(select={'int_name': 'CAST(t.name AS INTEGER)'}, 
         order_by=['int_name']) 
+0

会发生什么,如果列一个或多个值没有有效整数,它不惜以拼音,不应用顺序或失败? – sthzg

+2

它会在PostgreSQL上失败,并在MySQL上罚款...我刚刚从数据库转换后发现...如果有人知道如何绕过这一点,那会很棒! – gabn88

+0

对此有兴趣的解决方案,我们有一个既有文本又有整数的列。当排序'10'位于'1'旁边而不是'9'时。 –