搜索整个PostgreSQL数据库?

3
我有一个庞大的数据库,我不介意花费一些时间进行搜索,但由于各种原因我无法倾倒整个数据库。有什么最简单的查询语句可以搜索数据库中所有表格的所有字段以查找特定的文本字符串?
以下查询语句不能实现上述需求,但可以说明我的期望:
 SELECT * FROM * where * like '%mystring%'

有什么想法吗?

你为什么想要这样做?我想不出任何场景。 - user247702
2
我通常通过搜索转储文件(使用grepvim)来完成这个任务。如果您没有权限转储数据库,那么您也可能无法读取所有表格... - Erwin Brandstetter
2
理论上,您可以使用PL/PgSQL的“EXECUTE”语句、格式化语句以及针对“pg_catalog.pg_class”、“pg_catalog.pg_attribute”等的一些复杂查询来实现此操作。但这将是一个非常麻烦、缓慢且通常很糟糕的过程;我无法想象为什么您要这样做。 - Craig Ringer
2个回答

11
您可以利用PostgreSQL中的事实,tablename.*可以转换为文本。
因此,SELECT t.* FROM tablename t WHERE (t.*)::text LIKE '%somestring%'将返回任何一行,其中任何列包含somestring,无论列的类型如何。
如果在SELECT table_schema,table_name FROM information_schema上循环使用它,则类似于数据库转储中的grep,但您不需要该转储。

5

SELECT语句总是返回结果集。结果集是一种带有列名的表格,每个结果都有一行。

您正在查找字符串。因此,根本不需要查询任何非文本列。

必须指定select语句的“from”子句。您可以查询数据库中关于所有表名的元数据信息。然后获取所有文本列(如char、varchar、clob等),用于“where”子句。然后在每个表上应用构建的select语句。

此算法可以通过存储过程或任何程序来表达。

什么阻止您转储数据库?在UNIX系统上,您可以直接将转储管道传输到“grep”命令。


最好将转储持久化,然后再使用 grep。搜索往往需要尝试几次才能得到想要的结果。否则:+1 - Erwin Brandstetter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接