postgresql / psql查询where子句多个“或”从文件中读取

时间:2014-02-14 16:33:36

标签: sql postgresql psql bulk-load

很抱歉,如果之前有过类似的问题(我搜索过但无法找到任何有用的内容)。

我有一张表格,其中包含数据传输的详细信息。其中一个字段是与传输相关联的IP。我需要开发一个查询,它将获得表中记录的一个子集,该记录与79个IP中的一个匹配(表中有608个不同的IP')。我有一个文件,其中所需的IP由换行符分隔。有没有办法开发一个查询这个IP文件的查询来获取所需的记录,而不是我手动输入由"或"分隔的每个IP?

1 个答案:

答案 0 :(得分:5)

如果您在数据库或客户端中使用由换行符分隔的IP文本,则此查询将完成此任务:

将列表转换为数组,取消它并加入主表:

SELECT *
FROM  (SELECT unnest(string_to_array(your_list_of_ips, E'\n')) AS ip) sub
JOIN  data_transfers d USING (ip);

有关手册here中使用过的功能的更多信息。

SQL COPY

要直接从文件导入,您可以使用COPY。数据文件必须与Postgres在同一台机器上,您需要成为数据库超级用户。

这次我们每行只有一个IP:

CREATE TEMP TABLE tmp(ip text);

COPY tmp FROM '/path/to/file';

SELECT *
FROM  tmp
JOIN  data_transfers d USING (ip);

psql \copy

如果您的文件位于其他计算机上,或者您没有超级用户权限,请使用(大部分)等效的\copy psql。要从bash中执行此操作(如评论中所请求的):

psql dbname

dbname=# \set ips `cat ips.txt`

dbname=# SELECT *
dbname-# FROM  (SELECT unnest(string_to_array(:'ips', E'\n')) AS ip) sub
dbname-# JOIN  data_transfers d USING (ip);

\set是设置变量的psql元命令 - 在这种情况下是文件的内容。
ips.txt是您的IP文件。
:'ips'是单引号SQL interpolation的语法。