我整天都在努力解决这个问题,并尝试了所有可能的方法。这就是问题:
我正在处理的字段有这样的格式:
XXX年例子:001-2014(字符串)
假设我们有这些记录:
我期望获得的结果是011-2014(换句话说,最早的一年具有最大价值)
我写的这个查询在PostgreSql上运行正常:
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”列拆分为2个部分。结果是这样的:
part1的|第2部分
001 | 2014年
当我尝试在Python代码中引入它时,它使用升序返回正确的值,但在降序时返回('无')
这是我在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子句'它将返回('无',)
无论如何,请不要修理它或以其他方式解决它?
谢谢
答案 0 :(得分:0)
该列中有空值。当你要求降序时,首先会出现空值:
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)
答案 1 :(得分:0)
我找到了解决问题的方法。 我将查询更改为此
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
谢谢大家的回复