Fundo
Usando o PostgreSQL 9.1, portanto WITH ORDINAL
(um recurso 9.4) não está disponível.
Problema
Procurando simplificar o código que gira uma matriz bidimensional.
Código
Um exemplo de trabalho excessivamente detalhado que ilustra o problema é:
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
Isso produz os resultados corretos com as unnest
linhas da matriz 'ed dinamizadas nas colunas desejadas:
aspect | preference
----------------+--------------------
COLOUR_SCHEME | RASPBERRY_BLISS
FONT | TERMES_HEROS
LIST_LAYOUT | BULLET_SNOWFLAKE
Pergunta
Qual é a maneira mais simples de escrever essa consulta (por exemplo, menos linhas de código, menos SELECT
s aninhados ou menos referências ao array)?
Aqui está uma possível solução:
A
WITH
parte está lá para centralizar a entrada de dados. Caso contrário, ele apenas pega todos os sub-arrays e seleciona os elementos deles. Verifique isso no SQLFiddle .