sql >> Databáze >  >> RDS >> PostgreSQL

django - agregace klíčů specifických pro pole json a pořadí podle agregace

Pochopil jsem, že chcete sečíst hodnotu a hodnotu b pro každý řádek a poté každý řádek seřadit podle hodnoty součtu. správně?

-> ->> Takto vybrat klíč nebo hodnotu ve formátu JSON v PostgreSQL (nevím, jestli to funguje i v MySQL nebo jiných, normálně jsem pracoval s PostgreSQL). Dobrý zdroj je v zde . vaše data ve sloupci s názvem 'data ' je {"aa":3, "bb":2, "cc":5} . takže vyberete hodnotu aa pomocí data->>'aa' . Co když {'classification':{'pc':5000}} ? musíte vybrat hodnotu pc. Poté data->'classification'->>'pc'

::zápis je operace přetypování.

CAST(data->'aa' AS INTEGER)

data->'aa'::int

class RawSQL(sql, params, output_field=None)

RawSQL("((data->>'aa'::int), (0,)") neznamená, že pokud aa neexistuje, má hodnotu 0. 0 jsou parametry.

queryset.annotate(val=RawSQL("select col from sometable where othercol = %s", (someparam,)))

No, pokud můžete upravit svá data takto

  • id:1, data ={'aa':1, 'bb':2, 'cc':4}
  • id:2, data ={'aa':3, 'bb':2, 'cc':0}
  • id:3, data ={'cc':7, 'bb':0, 'cc':0}
  • id:4, data ={'bb':7, 'bb':0, 'cc':0}

To může fungovat.

Contract.objects.annotate(
sumVal=RawSQL("((data->>'aa')::int)", (0,))+RawSQL("((data->>'cc')::int)",(0,)))
.order_by('sumVal')

Navrhl jsem použít Coalesce. autor této otázky přišel na to. Níže je uveden kód.

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')


  1. SQL kombinující dva sloupce do jedné proměnné

  2. Jak získat záznamy náhodně z databáze Oracle?

  3. Jaký je rozdíl mezi typy DATE, TIME, DATETIME a TIMESTAMP

  4. Jak vytvořit tabulku v SQL – Příklad dotazu Postgres a MySQL