sql - 如何将整数转换为可在 postgresql 中用作列名的字符串?

标签 sql postgresql

我正在尝试使用两个循环来 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/

相关文章:

javascript - 想使用 Sequelize 从对象数组中删除任务

sql - 如何在关系数据库中维护每个用户最近查看的 N 个项目的列表

基于单独单词的 SQL 搜索查询

mysql - IS NOT NULL 查询应该使用什么索引

选择序列号的 SQL 查询

sql - 在 Postgres 中从另一个物化 View 调用一个物化 View

postgresql - Postgres : Large join optimisation

postgresql - 如果未在命令行中指定,则仅在 psql 脚本中设置变量

sql - 从 Golang API 远程访问 OVH SQL 数据库

mysql - 将两行结果合并为一行 MYSQL