2017-07-20 1 views
0

Ich habe eine postgresql Tabelle von Städten (1 Zeile = 1 Stadt) mit einem Jsonb Colum mit dem Namen der Stadt in verschiedenen Sprachen (als Liste, kein Array). Zum Beispiel für Paris (Frankreich) Ich habe:Suche nach einem Wert in einer Jsonb-Liste von Schlüsseln/Werten

id_city (integer) = 7444 
name_city (text) = Paris 
names_i18n (jsonb) = {"name:fr":"Paris","name:zh":"巴黎","name:it":"Parigi",...} 

In Wirklichkeit in meiner Tabelle habe ich rund 20 verschiedene Sprachen. Also versuche ich, eine Stadt zu finden, die nach einem beliebigen Namen sucht: den Wert von xx, der mit einem vom Benutzer angegebenen Parameter übereinstimmt, aber ich kann nicht herausfinden, wie man die jsonb-Spalte auf diese Weise abfragt. Ich habe unter so etwas wie die Anforderung versucht, aber es scheint nicht zu dem guten syntaxe

select * from jsonb_each_text(select names_i18n from CityTable) 
where value ilike 'Parigi' 

ich auch die folgenden

select * from CityTable where names_i18n ? 'Parigi'; 

versucht habe, aber es scheint nur für die Schlüsselrolle zu arbeiten Gibt es für den Wertteil des JSONB einen ähnlichen Operator? Ich brauche auch einen Weg zu wissen, welcher Name: XX wurde gefunden, nicht nur der Name der Stadt. Jeder hat eine Ahnung?

Antwort

1
with CityTable (id_city, name_city, names_i18n) as (values(
    7444, 'Paris', 
    '{"name:fr":"Paris","name:zh":"巴黎","name:it":"Parigi"}'::jsonb 
)) 
select * 
from CityTable, jsonb_each_text(names_i18n) jbet (key, value) 
where value ilike 'Parigi' 
; 
id_city | name_city |       names_i18n       | key | value 
---------+-----------+--------------------------------------------------------------+---------+-------- 
    7444 | Paris  | {"name:fr": "Paris", "name:it": "Parigi", "name:zh": "巴黎"} | name:it | Parigi 
+0

Hallo, es funktioniert gut, danke! Aber die Abfrage ist sehr lang zu laufen .... Ich habe einen GIN-Index auf der Jsonb-Spalte names_i18n, gibt es noch etwas, das ich tun kann, um die Abfrage schneller zu machen? –

+1

@ThomasPerrin Wenn Sie noch die DB erstellen, dann normalisieren Sie sie. Im Grunde erstellen Sie eine 'names_i18n' Tabelle mit 3 Spalten: id_city, language_code und name. –

Verwandte Themen