2017-06-23 50 views
2

我的JSON數據是這樣的:jsonb像嵌套對象查詢陣列中的

[{ 
    "id": 1, 
    "payload": { 
    "location": "NY", 
    "details": [{ 
      "name": "cafe", 
      "cuisine": "mexican" 
     }, 
     { 
      "name": "foody", 
      "cuisine": "italian" 
     } 
    ] 
    } 
}, { 
    "id": 2, 
    "payload": { 
    "location": "NY", 
    "details": [{ 
      "name": "mbar", 
      "cuisine": "mexican" 
     }, 
     { 
      "name": "fdy", 
      "cuisine": "italian" 
     } 
    ] 
    } 
}] 

給定文本爲「foo」我要回所有具有此子元組。但我無法弄清楚如何編寫相同的查詢。

我跟着this related answer但無法弄清楚如何去做LIKE
這就是我現在的工作:

SELECT r.res->>'name' AS feature_name, d.details::text 
    FROM restaurants r 
    , LATERAL (SELECT ARRAY (
    SELECT * FROM json_populate_recordset(null::foo, r.res#>'{payload, 
     details}') 
    ) 
    ) AS d(details) 
WHERE d.details @> '{cafe}'; 

不是傳遞的cafe我想通過ca並獲得相匹配的文本,結果整個文本。

回答

0

您的解決方案可以簡化一些:

SELECT r.res->>'name' AS feature_name, d.name AS detail_name 
FROM restaurants r 
    , jsonb_populate_recordset(null::foo, r.res #> '{payload, details}') d 
WHERE d.name LIKE '%oh%'; 

或者更簡單,但在jsonb_array_elements()中,因爲在此示例中根本不需要行類型(foo):

SELECT r.res->>'name' AS feature_name, d->>'name' AS detail_name 
FROM restaurants r 
    , jsonb_array_elements(r.res #> '{payload, details}') d 
WHERE d->>'name' LIKE '%oh%'; 

dbfiddle here

但這正是:

我想返回所有具有此子元組。

您正在返回所有JSON數組元素(每個基錶行的0-n),其中一個特定的鍵('{payload,details,*,name}')匹配(區分大小寫)。

而你原來的問題有一個嵌套的JSON數組。你爲這個解決方案刪除了​​外部數組 - 我也這樣做了。

根據您的實際要求,new text search capability of Postgres 10可能會有用。

+0

是的。但我有ID,頂層元組的名稱。這就是我要返回的東西(具有substr的id)。感謝您的觀察。 –