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

sha*_*aun 1 sql postgresql bulk-load psql

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

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

Erw*_*ter 5

如果您在数据库或客户端中使用由换行符分隔的IP文本,则此查询将执行以下操作:

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

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

更多关于本手册中所使用的功能在这里.

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);
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

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