我得到了一个基于键值的表,其中每个键值对分配给一个由id标识的实体:
|_id__|_key_______|_value_|
| 123 | FIRSTNAME | John |
| 123 | LASTNAME | Doe |
我想把它变成这样的结构:
|_id__|_firstName_|_lastName_|
| 123 | John | Doe |
我想可以使用crosstab
函数中的postgres构建来完成它。
你能告诉我怎么做并解释它为什么有效吗?
首先激活tablefunc
扩展中的构建:
CREATE EXTENSION tablefunc;
然后创建表并添加样本数据:
CREATE TABLE example (
id int,
key text,
value text
);
INSERT INTO example VALUES
(123, 'firstName', 'John'),
(123, 'lastName', 'Doe');
现在让我们准备一下qazxsw poi声明:
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);