我有一个庞大的数据库,我不介意离开搜索一段时间,但我不能因各种原因转储整个数据库。我能写的最简单的查询是什么,它将搜索数据库中所有表的所有字段以获取特定的文本字符串?
以下内容不起作用,但应展示我希望看到的内容:
SELECT * FROM * where * like '%mystring%'
有什么想法吗?
答案 0 :(得分:5)
SELECT语句始终返回结果集。结果集是一种具有列名的表,每个结果都有一行。
您正在寻找一个字符串。因此,根本不需要查询任何非文本列。
必须指定select的'from'子句。您可以查询数据库中有关所有表名的元数据信息。然后获取要在'where'子句中使用的所有文本列(如char,varchar,clob,...)。然后在每个表格上应用构造的选择。
该算法可以用存储过程或任何程序表示。
是什么阻止您转储数据库?在UNIX系统上,您可以将转储直接传递给'grep'命令。
答案 1 :(得分:5)
您可以利用PostgreSQL中tablename.*
可以转换为文本的事实。
因此,SELECT t.* FROM tablename t WHERE (t.*)::text LIKE '%somestring%'
将返回任何列包含somestring
的行,无论列的类型如何。
如果在SELECT table_schema, table_name FROM information_schema
的循环中使用,它可以与数据库转储中的grep
相比,除非您不需要转储。