如何在整个数据库中搜索字符串?

时间:2009-02-11 13:21:10

标签: database search informix

我有一个包含大量表格的informix数据库。

我知道某个表中某处有一个字符串“example”,但不知道它是哪个表或者是哪个列。 (我知道这是一种非常罕见的情况)

由于表的数量很多,因此无法手动查找。如何在这个大型数据库中找到这个值?有任何查询可以找到吗?

提前致谢!

2 个答案:

答案 0 :(得分:3)

在Informix中,确定包含字符数据的列是繁琐但可行的。幸运的是,你不太可能使用像DISTINCT TYPE这样的深奥功能,这会使搜索变得更难。 (Alphadogg建议卸载 - 正如我在他对他的回答的评论中所说的那样使用dbexport - 这是有道理的,特别是如果文本可能出现在CLOB或TEXT字段中。)你需要知道类型CHAR,NCHAR,VARCHAR,NVARCHAR和LVARCHAR的类型编号为0,13,15,16和43.此外,如果列为NOT NULL,则会向该数字添加256。因此,通过此查询找到数据库中的字符数据列:

SELECT t.owner, t.tabname, c.colname, t.tabid, c.colno
    FROM "informix".systables t, "informix".syscolumns c
    WHERE t.tabid = c.tabid
      AND c.coltype IN (0, 13, 15, 16, 43, 256, 269, 271, 272, 299)
      AND t.tabtype = 'T'  -- exclude views, synonyms, etc.
      AND t.tabid  >= 100  -- exclude the system catalog
    ORDER BY t.owner, t.tabname, c.colno;

这会生成要搜索的地点列表。你可能会看上去并让SELECT生成一个适合重新提交的字符串作为查询 - 这是留给读者的练习。

答案 1 :(得分:2)

通常,您有两种方法。

一种方法是将每个表转储到单个文本文件并grep文件。这可以在小型数据库上手动完成,或者在较大的数据库中通过脚本完成。查看UNLOAD和dbaccess。 BASH脚本中的示例:(您需要静态或通过查询在脚本中生成表列表。)

unload_tables () {

for table in ${TABLE_LIST} do
    dbaccess database_name << EOF
    unload to "${OUT_PATH}/${table}/.out"
    select * from $table;
    EOF
done
}

或者,这有点复杂。您可以使用systablessyscolumns以类似的自动方式为数据库中的每个表和列创建一个特定的SELECT(按“example”过滤每一列),然后运行每个sql。

例如,此查询显示所有表中的所有列:

SELECT tabname, colno, colname, coltype, collength
FROM systables a, syscolumns b 
WHERE a.tabid = b.tabid

很容易对此进行调整,以便SELECT返回一个正确的格式化SQL字符串,允许您查询数据库中的“示例”匹配项。对不起,我没有准备就绪的完整解决方案,但如果你谷歌搜索“informix systables syscolumns”,你会看到很多方法可以使用这些信息。

相关问题