【问题标题】:Search entire postgres database? [duplicate]搜索整个 postgres 数据库? [复制]
【发布时间】:2013-06-11 04:00:30
【问题描述】:

我有一个庞大的数据库,我不介意离开搜索一段时间,但由于各种原因我无法转储整个数据库。我可以编写的最简单的查询是什么,它将在数据库中所有表的所有字段中搜索特定的文本字符串?

以下内容不起作用,但应该展示我希望看到的内容:

 SELECT * FROM * where * like '%mystring%'

有什么想法吗?

【问题讨论】:

  • 为什么要这样做?我想不出一个场景。
  • 我通常通过搜索转储来做到这一点(使用grepvim)。很有可能,如果您不允许转储数据库,也不允许您读取所有表...
  • 理论上你可以使用 PL/PgSQL 的 EXECUTEformat 语句和针对 pg_catalog.pg_classpg_catalog.pg_attribute 等的一些复杂查询来做到这一点。这将是一个主要的痛苦做,缓慢,而且通常很糟糕;我无法想象你为什么要这样做。

标签: postgresql


【解决方案1】:

SELECT 语句总是返回一个结果集。结果集是一种具有列名和每个结果一行的表。

您正在寻找一个字符串。所以根本不需要查询任何非文本列。

必须指定选择的“来自”子句。您可以查询数据库中有关所有表名的元数据信息。然后获取要在“where”子句中使用的所有文本列(如 char、varchar、clob...)。然后在每个表上应用构造的 select。

这个算法可以用存储过程或任何程序来表达。

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

【讨论】:

  • 可能会更好地保留转储,然后是 grep。搜索往往需要多次尝试。否则:+1
【解决方案2】:

您可以利用在 PostgreSQL 中,tablename.* 可以转换为文本这一事实。

因此,SELECT t.* FROM tablename t WHERE (t.*)::text LIKE '%somestring%' 将返回任何列包含somestring 的任何行,无论该列的类型是什么。

如果在SELECT table_schema, table_name FROM information_schema 上的循环中使用,它与数据库转储中的grep 相当,除非您不需要转储。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-08
    • 1970-01-01
    • 2019-05-25
    • 2020-10-14
    • 1970-01-01
    • 2014-12-09
    • 1970-01-01
    相关资源
    最近更新 更多