抱歉,如果之前有人问过类似的问题(我搜索过但找不到任何有用的东西)。
我有一张表,其中包含数据传输的详细信息。其中一个字段是与传输关联的 IP。我需要开发一个查询,它将获得表中与 79 个 IP 之一匹配的记录子集(表中有 608 个不同的 IP)。我有一个文件,其中所需的 IP 由换行符分隔。有没有办法开发一个查询来读取这个 IP 文件以获取所需的记录,而不是我手动输入每个由“或”分隔的 IP?
抱歉,如果之前有人问过类似的问题(我搜索过但找不到任何有用的东西)。
我有一张表,其中包含数据传输的详细信息。其中一个字段是与传输关联的 IP。我需要开发一个查询,它将获得表中与 79 个 IP 之一匹配的记录子集(表中有 608 个不同的 IP)。我有一个文件,其中所需的 IP 由换行符分隔。有没有办法开发一个查询来读取这个 IP 文件以获取所需的记录,而不是我手动输入每个由“或”分隔的 IP?
如果您在数据库或客户端中有 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 插值的语法。