2016-08-03 5 views
0

ich Problem mit dem Update haben jsonb Typ in Postgree,PostgreeSQL Abfrage n JSON-Daten Manipulieren

dies ist mein Beispiel json

{ 
    "total": 2, 
    "products":[ 
     {"name": "guitar", "price": 100000, "brand": "yamaha"}, 
     {"name": "guitar", "price": 100000, "brand": "kramer"} 
    ] 
} 

und das ist mein Skript, folgende Antwort von here

update product_map t1 
set data = (
    select jsonb_agg(val) 
    from (
     select case 
      when value->>'brand' = 'yamaha' then jsonb_set(value, '{price}', '3200') 
      else value end val 
     from product_map t2, jsonb_array_elements(data->'products') 
     where t1.merchant = t2.merchant 
     and t2.merchant like '0002%' 
    ) s 
) 
where t1.merchant like '0002%'; 

Es gibt keinen Fehler, aber mein JSON wurde in

[ 
    {"name": "guitar", "price": 3200, "brand": "yamaha"}, 
    {"name": "guitar", "price": 100000, "brand": "kramer"} 
] 
geändert

Ich möchte die Daten in diesem Fall aktualisieren ist "Preis", , aber ich möchte nicht das JSON-Format ändern. Jede Hilfe wäre sehr willkommen.

Danke

+0

[Betrachten Sie die Daten zu normalisieren] (https://www.google.com.br/search?q=database+normalization&ie=utf-8&oe=utf-8&gws_rd=cr&ei= xduhV_r9H8SFwgT65KyIDA) –

Antwort

1

In Ihrer Anfrage Sie Objekt ganze json zu json Array ersetzen, so dass Sie ein solches Ergebnis bekommen.

Bitte versuchen Sie diese

update product_map t1 
    set data = (
     select json_build_object('total',data#>>'{total}','products',jsonb_agg(val)) 
     from (
      select data, 
case when value->>'brand' = 'yamaha' then jsonb_set(value, '{price}', '3200') 
       else value end val 
      from product_map t2, jsonb_array_elements(data->'products') 
      where t1.merchant = t2.merchant 
      and t2.merchant like '0002%' 
     ) s)where t1.merchant like '0002%'; 
+0

danke für Ihre Antwort, aber wenn ich das Skript ausführen bekomme ich Fehler, "Fehler: Spalte" s.produk "muss in der GROUP BY-Klausel erscheinen oder in einer Aggregatfunktion verwendet werden LINE 3: auswählen json_build_object ('total', produk # >> '{total}', 'produc ... "... und ich versuche in der inneren Abfrage" select data ... "" group by s.produk "einzufügen und es ist Arbeit, Ich hoffe, dass s ist korrekt, aber wenn Sie eine Meinung zu diesem Fehler haben, bitte informieren Sie mich erneut..als Dank wieder .. – sedayux