2016-06-02 12 views
1

Ich habe eine Jsonb-Spalte, "Produkt" genannt, die ein ähnliches Jsonb-Objekt wie das Folgende enthält. Ich versuche herauszufinden, wie man eine LIKE-Anweisung gegen die gleichen Daten in einem postgresql 9.5 durchführt.Postgresql 9.5 JSONB verschachtelte Arrays LIKE-Anweisung

{ 
    "name":"Some Product", 
    "variants":[ 
    { 
     "color":"blue", 
     "skus":[ 
     { 
      "uom":"each", 
      "code":"ZZWG002NCHZ-65" 
     }, 
     { 
      "uom":"case", 
      "code":"ZZWG002NCHZ-65-CASE" 
     }, 
     ] 
    } 
]} 

Die folgende Abfrage funktioniert für die exakte Übereinstimmung.

Aber ich muss LIKE-Anweisungen wie "beginnt mit", "endet Breite" und "enthält" unterstützen. Wie würde das gemacht werden?

Beispiel: Sagen wir, ich möchte alle Produkte zurückgeben, die einen SKU-Code haben, der mit "ZZWG00" beginnt.

Antwort

1

sollten Sie UNNEST variants und skus (mit jsonb_array_elements()), so könnte man sku->>'code' untersuchen:

SELECT DISTINCT p.* 
FROM 
    products p, 
    jsonb_array_elements(product->'variants') as variants(variant), 
    jsonb_array_elements(variant->'skus') as skus(sku) 
WHERE 
    sku->>'code' like 'ZZW%'; 

Verwenden DISTINCT wie Sie in einer product mehrere Zeilen als Ergebnis mehrere Übereinstimmungen haben.

+0

Wird dies noch die Vorteile von Indizes nutzen? – jfutch

+0

Immer noch? Es gibt kein Wort über Indizes in der Frage. Welche Indizes meinst du? – klin

+0

Meine Entschuldigung .. Ich verwende .. 'CREATE INDEX auf Produkte Verwendung von GIN (Produkt jsonb_path_ops);' – jfutch

Verwandte Themen