如何将列的行值转换为列 - JDBCTemplate 和 PostgreSQL

问题描述

我目前有一张桌子:

id | info  | value       | date 
1  | desc  | description | 19-01-1990 10:01:23
2  | lname | Doe         | 19-11-1990 10:01:23
1  | fname | John        | 19-08-1990 10:01:23
1  | dob   | dob         | 19-05-1990 10:01:23
3  | fname | Jo          | 19-01-1990 10:01:23

我想查询和抓取数据并稍后与多个表进行连接,所以我需要这样做:

id | desc        | lname | fname | dob | desc        | date        | ... |
1  | description | Doe   | John  | dob | description | 19-01-1990 10:01:23 | ... |
2  | .........   | ..... | Jo    |     |             | ...         | ... |

我尝试过交叉表,但似乎不起作用。任何帮助表示赞赏

解决方法

您当前的表是典型的非规范化键值存储。您可以通过按 id 聚合然后使用 max CASE 表达式来生成所需的规范化输出:

SELECT
    id,MAX(CASE WHEN info = 'desc'  THEN value END) AS desc,MAX(CASE WHEN info = 'lname' THEN value END) AS lname,MAX(CASE WHEN info = 'fname' THEN value END) AS fname,MAX(CASE WHEN info = 'dob'   THEN value END) AS dob
FROM yourTable
GROUP BY
    id
ORDER BY
    id;

请注意,我没有任何日期列,因为您没有给出应该为每个 id 保留哪个日期值的逻辑。

至于您问题的 Spring 部分,您可能必须使用本机查询来执行上述操作。