2017-11-17 29 views
0

現在、構築中のシステムの注文データのデータ型としてJSONBを試しています。文書がかなり大きいため、ここでの最初の部分である(一部は問題という):それは、アレイ内の何かにワイルドカードを適用することになるとPostgresでJSONB配列をトラバースするときのワイルドカード

{ 
"appMessage": { 
    "order": { 
     "customerSurname": "Tyreus", 
     "shipment": { 
      "asnNumber": "CC56477332", 
      "shippingStore": "3321" 
     }, 
     "orderNumber": "7991218655", 
     "propositionCollectionStoreNumber": "5656", 
     "collectionPointId": "4", 
     "customerFirstname": "Isaac", 
     "orderLine": [{ 
      "collectionWindowFrom": "2017-01-18T09:00:00+00:00", 
      "lineNo": "1", 
      "skuNo": "7654321", 
      "createdDateTime": "2017-01-17T17:54:31+00:00", 

私たちが直面している問題があります。上記の例を使用して、「7で始まるskuNoですべてのレコードを取得する」と言うためにワイルドカード検索を実行するにはどうすればよいでしょうか?成功を収めて

SELECT 
    * 
FROM 
    ORDERS 
WHERE 
    ORDER_DATA->'appMessage'->'message'->>'enterpriseCode' LIKE 'TU%'; 

:配列の

外私は、次のようなワイルドカードをテストしています。しかし、配列が方程式を入力すると、すべてが不明確になります...

ご協力いただければ幸いです。

答えて

0

あなたはjsonb_array_elementsを使用してJSONB配列をネスト解除し、それをフィルタリングすることができます。

--Using 'intermediary' table unnested_json_array 
WITH test_data(json_column) AS (

    SELECT 
     jsonb_build_array(
      jsonb_build_object('lineNo', '1', 'skuNo', '7654321'), 
      jsonb_build_object('lineNo', '2', 'skuNo', '1654321'), 
      jsonb_build_object('lineNo', '3', 'skuNo', '7654321')   
     ) 

), unnested_json_array(json_column) AS ( 
    SELECT jsonb_array_elements((SELECT * FROM test_data)) 
) 
SELECT * FROM unnested_json_array WHERE json_column->>'skuNo' ILIKE '7%'; 

--Or even simpler using LATERAL JOIN 
WITH test_data(json_column) AS (
    SELECT 
     jsonb_build_array(
      jsonb_build_object('lineNo', '1', 'skuNo', '7654321'), 
      jsonb_build_object('lineNo', '2', 'skuNo', '1654321'), 
      jsonb_build_object('lineNo', '3', 'skuNo', '7654321')   
     ) 
) 
SELECT 
    json_elements.* 
FROM 
    test_data 
    JOIN LATERAL jsonb_array_elements(test_data.json_column) AS json_elements (order_line) ON TRUE 
WHERE 
    order_line->>'skuNo' ILIKE '7%'; 

--In your case: 
SELECT 
    json_elements.* 
FROM 
    ORDERS 
    JOIN LATERAL jsonb_array_elements(ORDER_DATA->'appMessage'->'order'->'orderLine') AS json_elements (order_line) ON TRUE 
WHERE 
    order_line->>'skuNo' LIKE '7%'; 
関連する問題