在postgreSQL查询的where子句中使用文本文件

时间:2015-05-05 14:15:45

标签: sql postgresql

这可能吗?基本上,我们将使用脚本从数据库中提取信息。我们正在尝试设计一个查询,该查询可以使用WHERE子句中的文本文件中的值列表来限制特定记录。此列表将定期更改,并且定期手动编辑查询效率不高。我查看了this question的SQL Server,我想在PostgreSQL中做类似的事情。

因此,例如,一个超级简单的查询可能类似于

text

1 个答案:

答案 0 :(得分:1)

你绝对可以做到这一点。如果走这条路线,我会在查询中使用Postgres COPY函数和临时表,完成后丢弃临时表。如果我没弄错的话,这将要求你的文件存在于Postgres可以控制的文件夹中,例如你的数据文件夹,无论你在哪里安装Postgres。

但是,为了更清洁一点,我更倾向于使用PL/R来做这样的事情。您可以快速读取文件并返回要在查询中使用的值数组。我相信你可以用PL / PYTHON替换PL / R或者其他任何你喜欢的方法来访问外部文件。

CREATE FUNCTION file_vals()
  RETURNS integer[] AS
  $BODY$
    return (readLines('C:/path/to/your/file.txt'))
  $BODY$
    LANGUAGE plr IMMUTABLE;

您的file.txt如下所示:

555
123
567

然后从您的函数调用(我将示例数据放在子查询中以简化):

WITH users AS(
  SELECT 123 AS userID
)
SELECT userID
FROM users
WHERE userID = ANY(file_vals())

编辑:正如DanielVérité在评论中指出的那样,重要的是要注意,这仅适用于您对数据库拥有管理员权限的情况。 PL / R和任何其他为您提供外部文件访问的语言扩展本身就是一种不受信任的语言,这意味着只有管理员可以使用这些语言创建函数。

同样重要的是要注意,您正在读取的文件必须可以直接从Postgres服务器访问。如果您是通过远程客户端执行这些查询,则需要先将该文件传输到服务器。