我得到了一个基于键值的表,其中每个键值对都分配给一个由id标识的实体:
|_id__|_key_______|_value_|
| 123 | FIRSTNAME | John |
| 123 | LASTNAME | Doe |
我想把它变成这样的结构:
|_id__|_firstName_|_lastName_|
| 123 | John | Doe |
我想可以在crosstab
函数中使用postgres构建来完成它。
您能告诉我该怎么做并解释它的工作原理吗?
答案 0 :(得分:7)
首先激活tablefunc
中的构建 - 扩展名:
CREATE EXTENSION tablefunc;
然后创建表并添加样本数据:
CREATE TABLE example (
id int,
key text,
value text
);
INSERT INTO example VALUES
(123, 'firstName', 'John'),
(123, 'lastName', 'Doe');
现在让我们准备crosstab
声明:
SELECT *
FROM example
ORDER BY id ASC, key ASC;
在这里拥有ORDER BY
非常重要。
结果:
|_id__|_key_______|_value_|
| 123 | FIRSTNAME | John |
| 123 | LASTNAME | Doe |
现在crosstab
创建了我们想要的表:
SELECT *
FROM crosstab(
'SELECT *
FROM example
ORDER BY id ASC, key ASC;'
) AS ct(id INT, firstname TEXT, lastname TEXT);
结果:
|_id__|_firstName_|_lastName_|
| 123 | John | Doe |
无论如何理解它是如何工作的,我发现只更改ORDER BY
最简单,看看会发生什么:
SELECT *
FROM crosstab(
'SELECT *
FROM example
ORDER BY id ASC, key DESC;'
) AS ct(id INT, firstname TEXT, lastname TEXT);
结果:
|_id__|_firstName_|_lastName_|
| 123 | Doe | John |
当我们更改了键的排序时,crosstab
函数会看到键在另一个方向上排序,从而反转生成的列。
另一件帮助我理解它是如何工作的事情:列定义是关于位置的:
SELECT *
FROM crosstab(
'SELECT *
FROM example
ORDER BY id ASC, key ASC;'
) AS ct(blablafirst INT, blablasecond TEXT, blablathird TEXT);
结果
|_blablafirst__|_blablasecond_|_blablathird_|
| 123 | Doe | John |