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或更少的对数组的引用)?
这是一个可能的解决方案:
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上检查一下。
| 归档时间: |
|
| 查看次数: |
5853 次 |
| 最近记录: |