2017-11-29 2 views
0

die postgres doc sagt, dass ich ?& können Sie überprüfen, ob ein JSONB Objektschlüssel enthält alle Elemente in einem Array. Gibt es etwas für mich zu überprüfen, ob alle Schlüssel in einem JSONB-Objekte von ein gegebenes Array enthalten sind?Postgres JSONB: überprüfen, ob alle Tasten * enthalten sind, durch * ein Array

damit eine Abfrage wie

select my_jsonb_column 
from my_table 
where my_jsonb_column *contained_by* array['a', 'b', 'c']; 

würde Ergebnisse wie die folgenden ergeben, wo die Schlüssel eine Teilmenge sind des gegebenen Array.

{'a': 1, 'b': 2} 
{'a': 1, 'b': 2, 'c': 3} 
+0

Hinweis zu arbeiten: 'Array (wählen jsonb_object_keys (my_jsonb_column))' und [Array-Funktionen und Operatoren] (https : //www.postgresql.org/docs/9.6/static/functions-array.html) – Abelisto

+0

danke für die Antwort! also habe ich eine lösung basierend auf ihrem vorschlag gepostet und es funktioniert, aber ich verstehe nicht, warum es nötig ist, 'select' innerhalb der' array' funktion zu haben. anscheinend geht es ohne sie nicht. wäre toll, wenn Sie mich auf einige Ressourcen für eine Erklärung hinweisen können. Vielen Dank! – 732b

+0

'array()' hier ist keine reguläre Funktion, sondern [Array Constructor] (https://www.postgresql.org/docs/current/static/sql-expressions.html#SQL-SYNTAX-ARRAY-CONSTRUCTORS). IMO Es ist nicht notwendig, zwei separate Formen des Konstruktors für die Unterabfrage und für [SRF] (https://www.postgresql.org/docs/current/static/functions-srf.html) Ergebnisse zu haben. – Abelisto

Antwort

1

dank @ abelisto Vorschlag kam ich mit diesem und es scheint

select * 
from my_table 
where array(select jsonb_object_keys(my_json_column)) <@ array['a', 'b', 'c']; 
Verwandte Themen