Skip to content

FLATTEN

FLATTEN is a Set Returning Function.

It returns a JSONB object with the fields "index", "key" and "value" for each element contained in the input JSONB.

sql
FLATTEN(jsonb_expression)
jsonb_expression
The JSONB value to flatten.

FLATTEN behavior

Objects

If the input JSONB is an object, FLATTEN returns a JSONB for each key-value pair in the object. Each JSONB has

  • index: null
  • key: the key of the key-value pair
  • value: the value of the key-value pair
sql
SELECT * FROM FLATTEN('{"name":"Barnie","type":"Dog","big":true}');
sql
flatten
----------------------------------------------
 {"index":null,"key":"big","value":true}
 {"index":null,"key":"name","value":"Barnie"}
 {"index":null,"key":"type","value":"Dog"}
(3 rows)

Arrays

If the input is an array, FLATTEN returns a JSONB for each element of the array. Each JSONB has

  • index: the index of the element
  • key: null
  • value: the value of the element
sql
SELECT * FROM FLATTEN('[7,[],1]');
sql
flatten
-----------------------------------
 {"index":0,"key":null,"value":7}
 {"index":1,"key":null,"value":[]}
 {"index":2,"key":null,"value":1}
(3 rows)

Primitives

If the input is a primitive type (string, number, boolean, or null), FLATTEN returns a single JSONB that has

  • index: null
  • key: null
  • value: the primitive itself
sql
SELECT * FROM FLATTEN('3');
--  {"index":null,"key":null,"value":3}

Syntactic Sugar

There is an alternate syntax for FLATTEN that accepts additional parameters in the form <jsonpath> AS <column name>.

This applies <jsonpath> to each row that would have been returned by the single argument version of FLATTEN, and returns the value obtained after applying the jsonpath as <column name>.

sql
SELECT * FROM FLATTEN('[7,[],1]', $.index AS i, $.value AS v) AS f;
sql
i | v
---+----
 0 | 7
 1 | []
 2 | 1
(3 rows)

The AS <alias> part is mandatory when using the multi argument syntax for FLATTEN.

JSON_OBJECT

JSON_OBJECT is an alias for FLATTEN.