我知道你想爲每一行總結一個值和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數據的鍵值總和 –