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它,否则使用一些默认值?这种方式允许我对我的不同表使用相同的查询而不会出错。
在全球范围内,这就是我想要做的事情:
经过多次研究,我仍未找到技术解决方案。我努力使用IF EXISTS,WHERE EXISTS,子查询等参数,并且无法设法做到这一点。有没有办法做或者我有错误的方法来看待这个问题?
答案 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
命令,而不管它们的名称和别名。
从列上的第二个联合表将被转换为第一个选择中的相应列,因此不必显式转换。