当前的search_path可以在查询中使用吗?

xeh*_*puk 3 postgresql postgresql-9.6

我想做这样的事情:

SELECT *
FROM information_schema.tables
WHERE table_schema IN (search_path)
Run Code Online (Sandbox Code Playgroud)

我在文档中找不到任何内容。是否可以?如何?

dez*_*zso 6

pg_settings是一个系统视图,包含当前上下文中可用的所有配置选项及其值:

视图 pg_settings 提供对服务器运行时参数的访问。它本质上是 SHOW 和 SET 命令的替代接口。它还提供对有关每个参数的一些事实的访问,这些事实不能从 SHOW 直接获得,例如最小值和最大值。

您可以像任何其他视图一样查询此视图,因此您可以获得如下值search_path

SELECT setting FROM pg_settings WHERE name = 'search_path';
Run Code Online (Sandbox Code Playgroud)

返回值为 a text,分隔符为', '。需要进行一些修改,以便您可以table_schema与此进行比较:

SELECT *
  FROM information_schema.tables
 WHERE table_schema = ANY (SELECT unnest(string_to_array(setting, ', ')) 
                             FROM pg_settings
                            WHERE name = 'search_path');
Run Code Online (Sandbox Code Playgroud)

这仍然只是一半完美,就像"$user"search_path. 解决此问题的一种方法是将其替换为当前用户,例如

... replace(setting, '"$user"', CURRENT_USER) ...
Run Code Online (Sandbox Code Playgroud)

在DBFiddle上查看所有这些工作。