2

抱歉,如果之前有人问过类似的问题(我搜索过但找不到任何有用的东西)。

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

4

1 回答 1

9

如果您在数据库或客户端中有 IP 由换行符分隔的文本,则此查询将完成这项工作:

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

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

更多关于手册中使用的功能here

SQLCOPY

要直接从文件导入,您可以使用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 插值的语法。

于 2014-02-14T16:49:54.127 回答