我正在尝试使用两个循环来 INSERT INTO new_table。问题是 old_table 是这样的,带有奇怪的“年-月”列名:
CREATE TABLE old_table
(
regionname character varying(10),
"1996-01" integer,
"1996-02" integer,
"1996-03" integer,
...
"2014-11" integer,
"2014-12" integer
)
等待数据的空 new_table 具有如下模式:
CREATE TABLE new_table
(
regionname character varying(10),
year integer,
month integer,
value integer
)
我想在下面的函数中使用参数 y 和 m 来创建列名。例如当循环中 y = 1996 和 m = 1 时,NEEDTOFILL 部分应该是可以用作列名的“1996-01”。
CREATE FUNCTION insertLoop() RETURNS void AS $$
BEGIN
FOR y IN 1996..2014 LOOP
FOR m IN 1..12 LOOP
INSERT INTO new_table(regionname, year, month, value)
(
SELECT regionname, y AS year, m AS month, **NEEDTOFILL** AS value
FROM old_table
WHERE **NEEDTOFILL** IS NOT NULL
);
END LOOP;
END LOOP;
END;
$$ LANGUAGE plpgsql;
NEETOFILL 应该是什么?或者有没有办法选择第 i 列而不是使用 SQL 中的实际列名?或者其他方法?
最佳答案
您需要使用::将整数转换为 varchar 并使用 || 连接喜欢...
y::varchar || '-' || m::varchar
编辑 你说得对。这将生成值而不是列名 然后你必须在变量中生成查询然后执行查询。像这样
query = 'INSERT INTO new_table(regionname, year, month, value)
SELECT regionname, y AS year, m AS month, ' || y::varchar || '-' || m::varchar || ' AS value
FROM old_table
WHERE ' || y::varchar || '-' || m::varchar || ' IS NOT NULL';
execute query;
关于sql - 如何将整数转换为可在 postgresql 中用作列名的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28202859/