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/