将二维数组从 n 行转置为 2 列

Dav*_*vis 6 postgresql pivot array

背景

使用 PostgreSQL 9.1,所以WITH ORDINAL(9.4 特性)不可用。

问题

希望简化旋转二维数组的代码。

代码

一个说明问题的工作,过于冗长的例子是:

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
Run Code Online (Sandbox Code Playgroud)

这将生成正确的结果,将unnest'ed 数组行旋转到所需的列中:

aspect          | preference
----------------+--------------------
COLOUR_SCHEME   | RASPBERRY_BLISS
FONT            | TERMES_HEROS
LIST_LAYOUT     | BULLET_SNOWFLAKE
Run Code Online (Sandbox Code Playgroud)

编写此查询的更简单方法是什么(例如,更少的代码行、更少的嵌套SELECT或更少的对数组的引用)?

dez*_*zso 5

这是一个可能的解决方案:

WITH data AS (
    SELECT '{ {"COLOUR_SCHEME", "RASPBERRY_BLISS"}, {"FONT", "TERMES_HEROS"}, {"LIST_LAYOUT", "BULLET_SNOWFLAKE"} }'::text[] AS arr
)
SELECT 
    arr[i][1] AS aspect, 
    arr[i][2] AS preference
FROM 
    data, 
    generate_subscripts((SELECT arr FROM data), 1) i
;
Run Code Online (Sandbox Code Playgroud)

WITH部分用于集中数据输入。否则,它只需要所有子数组并选择其中的元素。在SQLFiddle上检查一下