2015-03-04 10 views
5

Yeni bir konsept olduğu için online olarak bulmak için postgres ve jsonb ile oynamaya yeni başladım. Anahtarları ve değerleri içeren bir tabloyu yazdırmak için jsonb_each_text kullanmaya çalışıyorum ama bir csv aldım tek bir sütunda.PostgreSQL - jsonb_each

Aşağıdaki json'u jsonb olarak kaydediyorum ve sorgularımı test etmek için kullanıyorum.

{ 
    "lookup_id": "730fca0c-2984-4d5c-8fab-2a9aa2144534", 
    "service_type": "XXX", 
    "metadata": "sampledata2", 
    "matrix": [ 
    { 
     "payment_selection": "type", 
     "offer_currencies": [ 
      { 
       "currency_code": "EUR", 
       "value": 1220.42 
      } 
     ] 
    } 
    ] 
} 

ben "{" değeri Euro ": 1.220,42, "CURRENCY_CODE" ""}" bir sonucu verir

SELECT element -> 'offer_currencies' -> 0 
FROM test t, jsonb_array_elements(t.json -> 'matrix') AS element 
WHERE element ->> 'payment_selection' = 'type' 

ile offer_currencies diziye erişebilir i çalıştırmak eğer öyleyse, Ben olsun sorgu altına Yani bu sorguyu oluşturulan yukarıdaki teorisini kullanarak

select * from jsonb_each_text('{"value": 1220.42, "currency_code": "EUR"}') 

Key   | Value 
---------------|---------- 
"value"  | "1220.42" 
"currency_code"| "EUR" 

(I "' için değiştirmek zorunda)

SELECT jsonb_each_text(data) 
FROM (SELECT element -> 'offer_currencies' -> 0 AS data 
    FROM test t, jsonb_array_elements(t.json -> 'matrix') AS element 
    WHERE element ->> 'payment_selection' = 'type') AS dummy; 

Ama bu sütunda

record 
--------------------- 
"(value,1220.42)" 
"(currency_code,EUR)" 

cevap

12

burada birincil sorunun csv parmak izleri (PostgreSQL o sağlar) Bir sütun olarak bütün satırı seçmek olmasıdır. Bunu SELECT (jsonb_each_text(data)).* ... ile düzeltebilirsiniz.

Ancak: SELECT, genellikle hatalara (veya beklenmeyen sonuçlara) yol açabilen set-dönen işlevler yapmayın. Bunun yerine f.ex. LATERAL katılır/alt-sorgular:

select first_currency.* 
from test t 
    , jsonb_array_elements(t.json -> 'matrix') element 
    , jsonb_each_text(element -> 'offer_currencies' -> 0) first_currency 
where element ->> 'payment_selection' = 'type' 

Not: işlev FROM fıkrada çağırır LATERAL (: CROSS JOIN s burada) katılır örtülü bulunmaktadır.

+4

Bu gibi deyimler öğrenmek için herhangi bir kaynak önerebilir misiniz ("Genellikle hatalara yol açabilen, set-dönen işlevleri SEÇME")? – Jay