2016-08-17 5 views
1

Ich habe ein Feld in einer PostgreSQL-Datenbank mit einem JSONB-Typ im Format ["tag1","tag2"] und ich versuche, eine Suche zu implementieren, die Ergebnisse für eine prädiktive Dropdown (dh wenn ein Benutzer "t "und die Spalte existiert oben beide Tags zurückgegeben werdenAbfrage mit like auf JSONB Feld

Vorschläge, wie dies zu tun

ich die Abfrage unten versucht, aber es funktioniert nicht.?

SELECT table.tags::JSONB from table where table.tags::TEXT like 't%'; 
+0

Was "funktioniert" nicht darüber? Was ist dein erwartetes Ergebnis? – Nicarus

+0

Es gibt keine Ergebnisse zurück, obwohl Tags vorhanden sind, die mit der Abfrage übereinstimmen sollten. Ich bemerke, dass die Abfrage weg ist. Ich versuche, sie zu modifizieren, basierend auf der Antwort hier http://stackoverflow.com/questions/34596716/using-like-operator-for-array-of-objects-inside-jsonb -field-in-postgresql, aber weil die Jsonb-Struktur in der verknüpften Frage so unterschiedlich ist, kann ich nicht herausfinden, wie ich sie an meine Struktur anpassen kann – thurmc

+0

Werfen Sie einen Blick auf 'json_array_elements_text'. https://www.postgresql.org/docs/current/static/functions-json.html – Nicarus

Antwort

1

Eine Möglichkeit, die Sie tun können das verwendet jsonb_array_e lements_text() Funktion (https://www.postgresql.org/docs/current/static/functions-json.html)

Beispiel Test:

SELECT * 
FROM jsonb_array_elements_text($$["tag1","tag2","xtag1","ytag1"]$$::jsonb) 
WHERE value LIKE 't%'; 
value 
------- 
tag1 
tag2 
(2 rows) 

Seit jsonb_array_elements_text() erzeugt die Datensätze festgelegt und in Ihrem Fall gibt es keinen anderen Zustand als LIKE dann SEITEN mit (https://www.postgresql.org/docs/9.5/static/queries-table-expressions.html#QUERIES-LATERAL) sollen Ihnen helfen wie folgt aus:

SELECT T.tags 
FROM table T, 
LATERAL jsonb_array_elements_text(T.tags) A 
WHERE A.value LIKE 't%'; 
+0

Alternativ können Sie WITH (a.k.a. CTE) Abfrage verwenden. Weitere Informationen: [https://www.postgresql.org/docs/current/static/queries-with.html](https://www.postgresql.org/docs/current/static/queries-with.html) –

+0

Danke das hat perfekt funktioniert! Es war schwierig, Antworten zu finden, bei denen sich die JSONB-Spalte nicht in der Struktur eines komplexeren Objekts befand, sondern nur in einem Array – thurmc