sql - PostgreSQL : CAST column only if exists

标签 sql database postgresql csv postgresql-9.5

OS Linux Debian 5.3.1 如果有帮助的话。

我有一堆 CSV 文件,我设法将它们作为表导入到 PostgreSQL 中。它们都具有相同的总体布局(即全局相同的列),但其中一些略有不同(即其中一些可能会遗漏某些列)。更清楚地说,一般布局应该是 a、b、c、d、e 列,但是有些表只有 a、b、d、e 列,其他只有 b、c、d、e 列...

我想进行一个通用的 SQL 查询来更改列的类型(使用 CAST)并将它们导入到一个包含 a、b、c、d、e 列的全局表 (t_import) 中。

INSERT INTO t_import (a, b, c, d, e)
    SELECT (
      (CAST a AS integer) AS a,
      (CAST b AS character varying(14)) AS b,
      (CAST c AS integer) AS c,
      (CAST d AS character varying) AS d,
      (CAST e AS character varying) AS e
    FROM t_csv;

然而,由于某些表缺少某些列,我应该为每个要导入的表创建一个查询,这对于我拥有的表数量来说太麻烦了。

有没有办法检查我要导入的表中是否存在该列,只有存在时才对其进行 CAST,否则使用一些默认值?通过这种方式,我可以对不同的表使用相同的查询而不会出错。

在全局范围内,这是我想做的事情:

  • 检查我要导入的表中是否存在colum,
  • 如果该列存在,将其转换为我想要的类型并将其用于 INSERT INTO,
  • 如果该列不存在,则使用一些默认值,这样 INSERT INTO 仍然有要插入的内容,并且我不会收到错误消息。

经过多次研究,我仍然没有找到技术解决方案。我在 IF EXISTS、WHERE EXISTS、子查询等参数上苦苦挣扎......但无法做到这一点。有没有办法做到这一点,还是我看待这个问题的方式不对?

最佳答案

联合提供默认值的select 查询:

insert into t_import (a, b, c, d, e)

select
    a::integer,
    b::character varying(14),
    c::integer,
    d::character varying,
    e::character varying
from t_csv

union all

select
    null,
    a,
    null,
    b,
    c
from t2_csv

请注意,无论列的名称和别名如何,这些列都将按照它们被选择的顺序传递给 insert 命令。

来自第二个联合表的列将被强制转换为第一个选择中的相应列,因此无需显式强制转换。

关于sql - PostgreSQL : CAST column only if exists,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38630063/

相关文章:

sql select 使用 mysql 查询浏览器

c++ - 在 C++ 项目中包含数据库文件时出错

postgresql - 如何将几何数据字符串转换为度数?

mysql - 嵌套查询帮助

sql - SELECT 子句中不存在聚合函数时的 GROUP BY 行为

Php Mysqli 不更新数据库中的数据

sql - 选择具有最相似属性集的行

arrays - 在 postgres select 中,将列子查询作为数组返回?

SQL 将多行插入第二个/子表

mysql - 将 ORDER BY 添加到 LEFT OUTER JOIN