2

我想将 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可以做到这一点吗?

4

1 回答 1

3

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

  1. 使用与 CSV 文件对应的列创建一个临时表
  2. COPY FROM将您的 CSV 文件放入该临时表中
  3. 根据SELECT从临时表LEFT JOIN到最终表中的现有行插入到最终表中,因此您可以确定primary行是否已经存在
  4. 删除临时表

(顺便说一句,这意味着您可以使用一个SECURITY DEFINER函数,创建为root,但由权限较低的用户运行,CSV 文件名硬编码,而不是将整个导入运行为root。)

于 2013-06-10T02:31:58.667 回答