【发布时间】:2021-01-29 03:46:08
【问题描述】:
我正在尝试将相关值列表转换为相关矩阵。
但执行字符串查询后我无法获得结果。
列表/表格(命名为 corrtemp)是这样的:
| name | colname | value |
| ---- | ------- | ----- |
| a | a | 1 |
| a | b | 0.5 |
| a | c | 0.3 |
| b | a | 0.5 |
| b | b | 1 |
| b | c | 0.2 |
| c | a | 0.3 |
| c | b | 0.2 |
| c | c | 1 |
输出应该是这样的:
| name | a | b | c |
| ---- |-----| --- | --- |
| a | 1 | 0.5 | 0.3 |
| b | 0.5 | 1 | 0.2 |
| c | 0.3 | 0.2 | 1 |
不同名称的数量未知。所以我循环生成一个字符串查询。我想执行它并在结果控制台中获取查询结果。目前,我的代码是这样的:
do $$
declare
i integer := 0;
sql0 varchar := 'SELECT DISTINCT temp0.name, cor0.value AS '||(SELECT DISTINCT name FROM corrtemp LIMIT 1)||' FROM corrtemp AS temp0'||chr(13);
sql1 varchar := 'left JOIN corrtemp AS cor0 ON cor0.colname = temp0.name AND cor0.name = ''a'''||chr(13);
sql2 varchar := 'WITH temp';
sql4 varchar;
begin
sql4 := sql0 || sql1 ||chr(13);
i := i + 1;
while i < (SELECT COUNT(DISTINCT name) FROM corrtemp) loop
sql4 := chr(13)||
sql2||
CAST(i AS VARCHAR(5)) ||
' AS('||
chr(13)||
sql4||
')' ||
'SELECT temp'|| CAST(i AS VARCHAR(5)) || '.*, cor'|| CAST(i AS VARCHAR(5)) ||'.value AS '||(SELECT DISTINCT name FROM corrtemp LIMIT 1 OFFSET i)||' FROM temp'|| CAST(i AS VARCHAR(5))||chr(13)||
'left JOIN corrtemp AS cor'|| CAST(i AS VARCHAR(5)) || ' ON cor'|| CAST(i AS VARCHAR(5)) || '.colname = temp'|| CAST(i AS VARCHAR(5)) || '.name AND cor'|| CAST(i AS VARCHAR(5)) || '.name = '''|| (SELECT DISTINCT name FROM corrtemp LIMIT 1 OFFSET i)||''''||chr(13);
i := i + 1;
end loop;
end$$
我在do 中尝试了EXECUTE sql4,它只在信息控制台中返回“OK”。
我需要在结果控制台中显示查询结果,就像在简单地运行SELECT * FROM corrtemp 之后一样。
【问题讨论】:
-
我正在考虑使用
CREATE OR REPLACE FUNCTION corrsql() RETURNS TABLE,但我无法决定表格的列数。 -
就像已经评论的那样,SQL 要求在执行时知道返回类型。结果类型不能是完全动态的。也许您知道可能的不同名称的最大值,这是一个合理的数字?
-
@ErwinBrandstetter 是的,我能够知道不同名称的数量。每次调用函数时都应该允许更改名称和名称的数量。
标签: sql postgresql plpgsql dynamic-sql