【问题标题】:How to loop a postgresql query over a list of `where` conditions如何在`where`条件列表上循环postgresql查询
【发布时间】:2018-10-06 04:46:40
【问题描述】:

''正在使用 postgresql 9.5。

对于一个id,我可以查询如下:

select a,b from mytable where id = '1234' order by a,b;

第一季度。
我在一个 txt 文件中有 50 个感兴趣的唯一 ID。如何一次性对所有这 50 个 id 运行 ^ 查询?

mytable 中总共有大约 100000 条记录)

第二季度。
如果可能的话,我还想将结果递归地保存到不同的文本文件中。

我可以做 1 个文件

COPY "select a,b from mytable where id = '1234' order by a,b;" TO STDOUT CSVHEADER > '/tmp/1234.csv'

参考:psql - save results of command to a file
Save PL/pgSQL output from PostgreSQL to a CSV file

额外信息: 我正在从本地机器查询。
postgres 安装在 AWS 上。 (我有读取数据库的权限)。

【问题讨论】:

  • 之类的? select a,b from mytable where id in (select id from table_created_with_50_other_ids) order by a,b;
  • 好的,谢谢。这听起来是一个很好的起点。我必须创建一个新表并将这 50 个 ID 加载到其中并按照您的提示进行操作。

标签: database postgresql loops


【解决方案1】:

您可以将包含 id 的文本文件导入到临时表中,并将其用作IN 子句中的过滤器。

考虑一个包含这些 id 的文件...

1
3

..还有这个表结构和数据样本...

CREATE TABLE t (id SERIAL, val TEXT);
INSERT INTO t (val) VALUES ('foo'),('bar'),('foo2'),('bar2');

SELECT * FROM t;
 id | val  
----+------
  1 | foo
  2 | bar
  3 | foo2
  4 | bar2

将 id 导入临时表:

CREATE TEMPORARY TABLE tmp (id INT);
COPY tmp FROM '/tmp/ids.csv';

并在您的查询中使用它:

SELECT * FROM t WHERE id IN (SELECT id FROM tmp);
 id | val  
----+------
  1 | foo
  3 | foo2
(2 Zeilen)

或者在你的导出中使用COPY:

COPY (SELECT * FROM t WHERE id IN (SELECT id FROM tmp)) TO ... ;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 2018-12-24
    • 1970-01-01
    • 2022-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多