子查询中作为变量的postgresql列名 表1 id col1 col2 col3。。。 表2 col\u id col\u name 3432 col1 5342 col2 6756 col3

子查询中作为变量的postgresql列名 表1 id col1 col2 col3。。。 表2 col\u id col\u name 3432 col1 5342 col2 6756 col3,postgresql,Postgresql,现在我想生成如下表3: id列名称列值列id 请注意col1,col2,col3。。。这些都不正常。因此,我必须查询表2以获取col_id(我认为pivot在这里不起作用) 如何在SQL中执行此操作?您似乎需要这样的选择: table1 id col1 col2 col3... table2 col_id col_name 3432 col1 5342 col2 6756 col3 您也可以创建一个函数,尽管在实践中这会比较慢: SELECT t

现在我想生成如下表3: id列名称列值列id

请注意col1,col2,col3。。。这些都不正常。因此,我必须查询表2以获取col_id(我认为pivot在这里不起作用)


如何在SQL中执行此操作?

您似乎需要这样的选择:

table1 id col1 col2 col3... table2 col_id col_name 3432 col1 5342 col2 6756 col3 您也可以创建一个函数,尽管在实践中这会比较慢:

SELECT t2.id, 
   CASE 
     WHEN t2.col_name='col1' THEN t1.col1 
     WHEN t2.col_name='col2' THEN t1.col2
     WHEN t2.col_name='col2' THEN t1.col2 
     -- ... more columns
     ELSE NULL
   END
FROM table2 t2 LEFT JOIN table2 t1 ON t2.col_id = t1.id

很不清楚,这个问题是什么。请提出一个明确的问题。对不起。打字错误。应生成表3。更正了,是的。但是表1有数百列。我要为“何时”打几百行字吗?我是一个开发人员,但不是数据库管理员。也许我可以输出表并编写python来完成这项工作。使用脚本生成重复的SQL是完全合适的。我添加了一个函数示例,用于按名称提取列的值。当vs函数调用时,在一个很长的用例之间进行基准测试是很有趣的,但是由于为每一行规划和执行一个单独的查询,它几乎肯定会变慢。
CREATE OR REPLACE FUNCTION table1_col(id integer, name text) RETURNS text as $$
DECLARE
   col_val text;
BEGIN
   EXECUTE format('SELECT %s FROM table1 WHERE id=$1', name) 
     INTO col_val
     USING id;
   RETURN col_val;
END;
$$ LANGUAGE plpgsql;

SELECT table1_col(col_id,col_name) FROM table2;