从CSV有条件地插入postgres DB

时间:2013-06-10 02:23:23

标签: postgresql

我想将CSV导入到Postgres表中,但我希望能够根据表中现有的行来决定列是否应为0或1。

例如,我正在向表中添加联系人,并希望在没有主要联系人的情况下将其标记为主要联系人,否则将其添加为辅助联系人:

现有行:

contact_id | branch_id | primary
-------------+-----------+--------
1          | 100       | 1
2          | 101       | 1
3          | 101       | 0

CSV数据,

contact_id | branch_id
-----------+-----------
4          | 100
5          | 101
6          | 102
7          | 103

期望的结果,

contact_id | branch_id | primary
-----------+-----------+--------
1          | 100       | 1
2          | 101       | 1
3          | 101       | 0
4          | 100       | 0
5          | 101       | 0
6          | 102       | 1
7          | 103       | 1

注意联系人4和5被添加为辅助,因为这些分支已经存在主要联系人,而6和7被添加为主要联系人,因为这些分支不存在主要联系人。

这可以用postgres 9.2吗?

1 个答案:

答案 0 :(得分:2)

我将使用PL / pgSQL函数和临时表分两个阶段实现。基本上是:

  1. 使用与CSV文件对应的列创建临时表
  2. COPY FROM您的CSV文件进入该临时表
  3. 根据最终表中现有行的临时表SELECT中的LEFT JOIN插入到最终表中,以便确定primary行是否已存在
  4. 删除临时表
  5. (顺便说一句,这意味着您可以使用SECURITY DEFINER函数创建为root,但由权限较低的用户运行,CSV文件名为硬编码,而不是将整个导入作为root。)

相关问题