sha*_*aun 1 sql postgresql bulk-load psql
很抱歉,如果之前有过类似的问题(我搜索过但找不到任何有用的东西).
我有一个表格,其中包含数据传输的详细信息.其中一个字段是与传输相关联的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);
Run Code Online (Sandbox Code Playgroud)
更多关于本手册中所使用的功能在这里.
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)
\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插值的语法.
| 归档时间: |
|
| 查看次数: |
1926 次 |
| 最近记录: |