Search code examples
postgresqljsonb

Filtering elements inside an array


I have this JSON and would like to filter by WHERE installmentType = 'STANDARD'

In the SELECT clause I would like to return the region attribute.

{
    "processedResult": {
        "TYPE": "ACKNOWLEDGEMENT",
        "orderPayment": {
            "paymentDetails": [
                {
                    "installmentPayment": {
                        "installmentType": "STANDARD"
                    }
                }
            ]
        },
        "region": "US"
    }
}

Desired Output:

region type
US ACKNOWLEDGEMENT

What I've tried so far but this just gives me the paymentDetails block:

SELECT arr.item_object
FROM aosqe_ema_tools.ocs_response t,
jsonb_array_elements(t.ocsjsonb -> 'processedResult' -> 'orderPayment' -> 'paymentDetails') 
with ordinality arr(item_object, position)

Postgres Version : PostgreSQL 11.13


Solution

  • Use item_object in the WHERE clause:

    select 
      ocsjsonb -> 'processedResult' ->> 'region' as region,
      ocsjsonb -> 'processedResult' ->> 'TYPE' as type
    from ocs_response
    cross join jsonb_array_elements(
      ocsjsonb -> 'processedResult' -> 'orderPayment' -> 'paymentDetails') 
        as arr(item_object)
    where item_object -> 'installmentPayment' ->> 'installmentType' = 'STANDARD'
    

    Test it in db<>fiddle.