Ich habe eine Tabelle, die Daten in einer JSONB-Spalte speichert.Postgres-Tabelle mit JSONB-Daten abfragen
Nun, was ich tun möchte, ist, diese Tabelle abfragen und Datensätze abrufen, die bestimmte Werte für einen Schlüssel haben.
Dies funktioniert:
SELECT "documents".*
FROM "documents"
WHERE (data @> '{"type": "foo"}')
Aber was ich will zu tun ist, um alle Zeilen in der Tabelle holen, welche Typen foo
OR bar
haben.
Ich habe versucht, dieses:
SELECT "documents".*
FROM "documents"
WHERE (data @> '{"type": ["foo", "bar"]}')
Aber das scheint nicht zu funktionieren.
Ich habe auch versucht dies:
SELECT "documents".*
FROM "documents"
WHERE (data->'type' ?| array['foo', 'bar'])
Welche funktioniert, aber wenn ich einen Schlüssel wie so data->'type'
angeben nimmt es die dynamicity der Abfrage entfernt.
BTW, ich benutze Ruby on Rails mit Postgres, so dass alle Abfragen gehen . Dies ist, wie:
Document.where("data @> ?", query)
Vielen Dank für die Antwort @klin. Die Lösung 1 würde funktionieren, aber ich dachte über einen anderen Weg nach, coz Rails ist der API-Teil, und es kann Anfragen jeglicher Art geben, und ich möchte nicht in Pars Parsing gehen. Ich dachte also an einen saubereren Weg, der meiner Meinung nach da sein sollte, da dies nur eine elementare Operation ist. Was denken Sie? –
Ich weiß was du meinst und deswegen habe ich über die zweite Lösung geschrieben. Es gibt keinen saubereren. – klin
Ja, aber das Attribut kann sich ändern, es wird nicht immer Typ sein, also würde das Parsing wieder ins Bild kommen. –