I Postgresql verwenden 9.6 zur Zeit und versucht seit Stunden die folgenden gelöst auf die effizienteste Art und Weise zu erhalten:Postgresql 9.6: Abfrage bestimmte Bereiche eines JSONB Array
Mein Beispiel Tabelle:
id | data
-----------------------------------------------------------------------------------------------------------
10 | {"scores": [{"u": "Peter", s: 120}, {"u": "Joe", s: 100}, {"u": "Pam", s: 70}, {"u": "Lisa", s: 120}]}
11 | {"scores": [{"u": "Mae", s: 320}, {"u": "Max", s: 230}, {"u": "Moe", s: 170}, {"u": "Mini", s: 120}]}
12 | {"scores": [{"u": "Jack", s: 140}, {"u": "John", s: 110}, {"u": "Wes", s: 70}, {"u": "Mick", s: 20}]}
I benötigen eine Abfrage, um die ersten 2 Benutzernamen (u
) jeder Zeile zu erhalten.
So sollte mein Ergebnis so aussehen:
users
-----
Peter
Joe
Mae
Max
Jack
John
Und eine Abfrage, um die 2. und 3. Benutzernamen zu erhalten:
users
-----
Joe
Pam
Max
Moe
John
Wes
Was der effizienteste Weg sein würde, dieses Problem zu lösen? Meine realen Tabellen haben Arrays mit 100-400 Elementen und etwa 1500 Zeilen.
Wenn Sie dies oft machen müssen, dann denken Sie vielleicht an den Ratschlag in [dem Handbuch] (https://www.postgresql.org/docs/current/static/arrays.html) bezüglich normaler Arrays: "* Arrays sind keine Sätze; Die Suche nach bestimmten Array-Elementen kann ein Anzeichen für ein falsches Datenbankdesign sein. Erwägen Sie, für jedes Element, das ein Array-Element wäre, eine separate Tabelle mit einer Zeile zu verwenden. Dies wird einfacher zu suchen sein und wird wahrscheinlich besser skalieren für eine große Anzahl von Elementen * ". Dies gilt auch für Arrays im JSON-Objekt –