很抱歉,如果之前有过类似的问题(我搜索过但无法找到任何有用的内容)。
我有一张表格,其中包含数据传输的详细信息。其中一个字段是与传输相关联的IP。我需要开发一个查询,它将获得表中记录的一个子集,该记录与79个IP中的一个匹配(表中有608个不同的IP')。我有一个文件,其中所需的IP由换行符分隔。有没有办法开发一个查询这个IP文件的查询来获取所需的记录,而不是我手动输入由"或"分隔的每个IP?
答案 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中使用过的功能的更多信息。
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);
\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的语法。