PostgreSQL:CAST列只有存在

时间:2016-07-28 07:43:23

标签: 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 ...... / p>

我希望进行一般SQL查询以更改列的类型(使用CAST),并将它们导入一个包含a,b,c,d,e列的全局表(t_import)。

In [180]: (df.assign(rn=df.sort_values('priority', ascending=0).groupby('Query').cumcount() + 1)
   .....:    .query('Query=="3ds" and rn < 3')['Productid']
   .....: )
Out[180]:
index
7     2264036
16    1686079
Name: Productid, dtype: int64

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

有没有办法检查我想要导入的表中是否存在该列,只有在存在的情况下才存在,CAST它,否则使用一些默认值?这种方式允许我对我的不同表使用相同的查询而不会出错。

在全球范围内,这就是我想要做的事情:

  • 检查我要导入的表中是否存在列,
  • 如果列存在,请按照我想要的类型对其进行CAST,并将其用于INSERT INTO,
  • 如果列不存在,请使用一些默认值,以便INSERT INTO仍然有一些要插入的内容,而且我没有收到错误消息。

经过多次研究,我仍未找到技术解决方案。我努力使用IF EXISTS,WHERE EXISTS,子查询等参数,并且无法设法做到这一点。有没有办法做或者我有错误的方法来看待这个问题?

1 个答案:

答案 0 :(得分:0)

联合提供默认值的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命令,而不管它们的名称和别名。

从列上的第二个联合表将被转换为第一个选择中的相应列,因此不必显式转换。