मैं समझ गया था कि आप प्रत्येक पंक्ति के लिए एक मान और b मान का योग करना चाहते हैं और फिर प्रत्येक पंक्ति को योग मान के अनुसार क्रमित करना चाहते हैं। सही?
-> ->>
PostgreSQL में JSON प्रारूप में कुंजी या मान का चयन कैसे करें (मुझे नहीं पता कि यह MySQL या अन्य में भी काम करता है, मैंने सामान्य रूप से PostgreSQL के साथ काम किया है)। यहां
. 'data
. नाम के कॉलम में आपका डेटा 'है {"aa":3, "bb":2, "cc":5}
. इसलिए आप data->>'aa'
. द्वारा aa मान चुनें . क्या होगा अगर {'classification':{'pc':5000}}
? आपको पीसी मूल्य का चयन करने की आवश्यकता है। फिर data->'classification'->>'pc'
::नोटेशन कास्ट ऑपरेशन है।
CAST(data->'aa' AS INTEGER)
data->'aa'::int
क्लास RawSQL(sql, params, output_field=None)
RawSQL("((data->>'aa'::int), (0,)") का मतलब यह नहीं है कि अगर आ मौजूद नहीं है, तो इसका मान 0 है। 0 पैरा है।
queryset.annotate(val=RawSQL("select col from sometable where othercol = %s", (someparam,)))
ठीक है, अगर आप अपने डेटा को इस तरह संशोधित कर सकते हैं
- आईडी:1, डेटा ={'आ':1, 'बीबी':2, 'सीसी':4}
- आईडी:2, डेटा ={'आ':3, 'बीबी':2, 'सीसी':0}
- id:3, डेटा ={'cc':7, 'bb':0, 'cc':0}
- id:4, डेटा ={'bb':7, 'bb':0, 'cc':0}
यह काम कर सकता है।
Contract.objects.annotate(
sumVal=RawSQL("((data->>'aa')::int)", (0,))+RawSQL("((data->>'cc')::int)",(0,)))
.order_by('sumVal')
मैंने Coalesce का उपयोग करने का सुझाव दिया। इस प्रश्न के लेखक को पता चला। नीचे कोड है।
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')