2017-11-17 1 views
0

Wir testen derzeit JSONB als Datentyp für Auftragsdaten in einem System, das wir erstellen. Da das Dokument ziemlich groß ist, ist hier der erste Teil davon (der Teil, der wichtig ist):Wildcard beim Verfolgen von JSONB-Array in Postgres

{ 
"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", 

Das Problem, das wir konfrontiert sind, wenn es um die Anwendung einen Platzhalter, um etwas in einem Array kommt. Wie würde ich im obigen Beispiel eine Platzhaltersuche durchführen, um zu sagen: "Alle Datensätze mit einem SkuNo beginnend mit 7 abrufen"?

Außerhalb eines Arrays habe ich Wildcards getestet, wie:

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

Mit Erfolg. Aber sobald Arrays die Gleichung eingeben, wird alles unklar ...

Jede Hilfe würde sehr geschätzt werden.

Antwort

0

können Sie UNNEST JSONB Array jsonb_array_elements und anschließend filtern:

--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%';