Background
Using PostgreSQL 9.1, so WITH ORDINAL
(a 9.4 feature) is not available.
Problem
Looking to simplify the code that pivots a two-dimensional array.
Code
A working, overly-verbose example that illustrates the problem is:
SELECT
u.aspect,
u.preference
FROM (
SELECT
t.aspect_preference AS aspect,
-- Skip every second row
seq % 2 AS seq,
lead( aspect_preference, 1 ) OVER (ORDER BY t.seq) AS preference
FROM (
SELECT
unnest( '{ {"COLOUR_SCHEME", "RASPBERRY_BLISS"}, {"FONT", "TERMES_HEROS"}, {"LIST_LAYOUT", "BULLET_SNOWFLAKE"} }'::text[] ) aspect_preference,
-- Maintain array order after unnesting to a result set
generate_series( 1,
(array_ndims( '{ {"COLOUR_SCHEME", "RASPBERRY_BLISS"}, {"FONT", "TERMES_HEROS"}, {"LIST_LAYOUT", "BULLET_SNOWFLAKE"} }'::text[] ) *
array_length( '{ {"COLOUR_SCHEME", "RASPBERRY_BLISS"}, {"FONT", "TERMES_HEROS"}, {"LIST_LAYOUT", "BULLET_SNOWFLAKE"} }'::text[], 1 ) )
) seq
) t
ORDER BY
t.seq
) u
WHERE
u.seq = 1
This produces the correct results with the unnest
'ed array rows pivoted into the desired columns:
aspect | preference
----------------+--------------------
COLOUR_SCHEME | RASPBERRY_BLISS
FONT | TERMES_HEROS
LIST_LAYOUT | BULLET_SNOWFLAKE
Question
What is a simpler way to write this query (e.g., fewer lines of code, fewer nested SELECT
s, or fewer references to the array)?