我知道你想为每一行总结一个值和b值,然后按总和值排序每一行。对?
-> ->>
这是如何在PostgreSQL中选择JSON格式的键或值(我不知道它是否也适用于MySQL或其他,我通常使用PostgreSQL)。 here有很好的资源。您名为'data
'的列中的数据为{"aa":3, "bb":2, "cc":5}
。所以你选择一个值data->>'aa'
。如果{'classification':{'pc':5000}}
怎么办?你需要选择pc值。然后data->'classification'->>'pc'
::表示法是cast操作。
CAST(data->'aa' AS INTEGER)
data->'aa'::int
类RawSQL(SQL,则params,output_field =无)
RawSQL( “((数据 - >> 'AA' :: INT),(0,)”)并不意味着如果aa不存在,则它具有0值,0是params。
queryset.annotate(val=RawSQL("select col from sometable where othercol = %s", (someparam,)))
好吧,如果你可以修改你的数据是这样
- ID:1,数据= { 'AA':1, 'BB':2, '抄送':4}
- id:2 data = {'aa':3,'bb':2,'cc':0}
- id:3,data = {'cc':7,'bb':0,'cc ':0}
- ID:4,数据= {' B-B':7, 'BB':0, '抄送':0}
这可以工作。
Contract.objects.annotate(
sumVal=RawSQL("((data->>'aa')::int)", (0,))+RawSQL("((data->>'cc')::int)",(0,)))
.order_by('sumVal')
我建议使用合并。这个问题的作者想通了。下面有代码。
raw_sql = "+".join(["COALESCE((data->>%s)::int, 0)" for _ in ['aa', 'cc'])
MyMoodel.objects.all()
.annotate(my_sum=RawSQL(raw_sql, params=('aa', 'cc')))
.order_by('my_sum')
您拥有模型的哪种类型的对象(实例或查询集)? –
@NeErAjKuMaR - 我有一个查询集,我想根据模型字段进行聚合,并按汇总值 –
进行排序,但是你说你需要json数据的键值总和 –