postgresql crosstab简单示例

nhhxz33t  于 2023-11-18  发布在  PostgreSQL
关注(0)|答案(1)|浏览(105)

我得到了一个基于键值的表,其中每个键值对都被分配给一个由id标识的实体:

| id  | key       | value |
|-----|-----------|-------|
| 123 | FIRSTNAME | John  |
| 123 | LASTNAME  | Doe   |

字符串
我想把它变成这样的结构:

| id  | firstName | lastName |
|-----|-----------|----------|
| 123 | John      | Doe      |


我想可以使用postgres内置的crosstab函数来完成。

你能告诉我如何做,并解释为什么它的工作?

uwopmtnx

uwopmtnx1#

首先激活内置的tablefunc-extension:

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      |

工作原理#1

然而,为了理解它是如何工作的,我发现最简单的方法就是改变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函数看到键以另一个方向排序,从而反转生成的列。

工作原理#2

另一件帮助我理解它是如何工作的事情:列定义都是关于位置的:

SELECT *
FROM crosstab(
    'SELECT *
     FROM example
     ORDER BY id ASC, key ASC;'
) AS ct(blablafirst INT, blablasecond TEXT, blablathird TEXT);


结果

|_blablafirst__|_blablasecond_|_blablathird_|
| 123          | John         | Doe         |

相关问题