Sql查询(具有描述顺序和限制)不适用于python(OpenERP)
我整天都在努力解决这个问题,并尝试了我知道的所有可能的方法。问题是: 我正在处理的字段的格式如下: XXX年示例:001-2014字符串 假设我们有这些记录: 001-2014 011-2014 013-2013 我期望得到的结果是2011-2014年,换句话说,是价值最大的最早年份 我写的这个查询在PostgreSql上运行良好:Sql查询(具有描述顺序和限制)不适用于python(OpenERP),python,postgresql,openerp-7,Python,Postgresql,Openerp 7,我整天都在努力解决这个问题,并尝试了我知道的所有可能的方法。问题是: 我正在处理的字段的格式如下: XXX年示例:001-2014字符串 假设我们有这些记录: 001-2014 011-2014 013-2013 我期望得到的结果是2011-2014年,换句话说,是价值最大的最早年份 我写的这个查询在PostgreSql上运行良好: select split_part(numero_bl, '-', 1) as part1, split_part(numero_bl, '-'
select split_part(numero_bl, '-', 1) as part1,
split_part(numero_bl, '-', 2) as part2
from livraisons
ORDER BY part2 desc,part1 desc limit 1
split_part函数将列'numero_bl'拆分为两部分。因此结果如下:
第1部分|第2部分
001 | 2014
当我尝试在Python代码中引入它时,它使用升序返回正确的值,但在降序时返回“None”
下面是python中我的函数的一个简单版本:
def set_numero_bl(self, cr, uid, ids,name,arg,context=None):
res={}
cr.execute("""select split_part(numero_bl, '-', 1) as part1,
split_part(numero_bl, '-', 2) as part2
from livraisons
ORDER BY part2 desc,part1 desc limit 1""")
execution = cr.fetchone()
part1 = execution[0]
part2 = execution[1]
if part1:
if part2:
annee = int(part2)
nombre = int(part1)+1
valeur_final= str('%0*d' % (3, nombre))+"-"+str(annee)
for livraisons in self.browse(cr, uid, ids):
res[livraisons.id]= valeur_final
else:
valeur_final= str('%0*d' % (3, 1))+"-"+datetime.datetime.strftime(datetime.datetime.now(), '%Y')
for livraisons in self.browse(cr, uid, ids):
res[livraisons.id]= valeur_final
return res
当然,当我不放'else子句'时,它将返回'None'
请问,究竟有没有办法解决这个问题,还是用其他方法解决
谢谢该列中有空值。当您要求降序时,空值将首先出现:
select *
from (values (1), (null)) s(a)
order by a desc;
a
---
1
(2 rows)
如果您想保留空值,请告诉它最后订购空值
select *
from (values (1), (null)) s(a)
order by a desc nulls last;
a
---
1
(2 rows)
或者只是过滤掉空值
select *
from (values (1), (null)) s(a)
where a is not null
order by a desc;
a
---
1
(1 row)
我找到了解决问题的办法。 我把我的问题改成这个
cr.execute("""select max(numero_bl) as part from livraisons
where split_part(numero_bl, '-', 2) >= %s""",
((datetime.datetime.strftime(datetime.datetime.now(), '%Y')),))
首先,我只保留年份部分大于当前年份的记录,然后取字段“numero_bl”的最大值
如果有人感兴趣,以下是完整的代码:
def set_numero_bl(self, cr, uid, ids,name,arg,context=None):
res={}
cr.execute("""select max(numero_bl) as part
from livraisons
where split_part(numero_bl, '-', 2) >= %s""",
((datetime.datetime.strftime(datetime.datetime.now(), '%Y')),))
valeur = cr.fetchone()[0]
if valeur:
value = valeur.split('-');
nombre = int(value[0])+1
valeur_final= str('%0*d' % (3, nombre))+"-"+datetime.datetime.strftime(datetime.datetime.now(), '%Y')
for livraisons in self.browse(cr, uid, ids):
res[livraisons.id]= valeur_final
else:
valeur_final= str('%0*d' % (3, 1))+"-"+datetime.datetime.strftime(datetime.datetime.now(), '%Y')
for livraisons in self.browse(cr, uid, ids):
res[livraisons.id]= valeur_final
return res
感谢大家的回复首先,一般来说,您应该避免这样的建模数据。应该是两个字段。谢谢你的回复。是的,我知道如果它们是两个单独的字段,操作起来会更容易,但由于一些限制,我不得不将其存储在一个字段中。我也这么认为,但没有空值,所有记录所有filled@soukainas如果numero_bl为null;,则从livraisons中选择count*的结果是什么;?