在整个SQLite数据库中搜索ID

时间:2014-06-23 13:52:14

标签: sqlite

我使用SQLiteStudio查看和测试sqlite数据库,这意味着我无法访问fts3或fts4。

我有一个我需要从数据库中找到的ID,并且不知道它属于哪45个表。是否有可以运行的查询将返回它所属的表名?

2 个答案:

答案 0 :(得分:1)

在SQLiteStudio中有一个解决方案。请注意,这会对所有表进行全面扫描,每个表中的所有列(直到找到匹配 - 然后停止),因此这可能非常慢。警告。

以下是您的工作方式:

运行SQLiteStudio,打开"自定义SQL函数"对话框(它是带有蓝砖图标的对话框)。 添加新功能,例如" find"并将其实现语言设置为Tcl(在右上角)。将以下代码粘贴为实现。

set value [string map [list "'" "''"] $0]
foreach table [db eval {select name from sqlite_master where type = "table"}] {
    set cols [list]
    foreach infoRow [db getTableInfo $table] {
        lappend cols "\[[dict get $infoRow name]\] = '$value'"
    }
    set res [db eval "SELECT rowid FROM \[$table\] WHERE [join $cols { OR }]"]
    if {[llength $res] > 0} {
        return "found in table $table in rows with following ROWID: [join $res ,\ ]"
    }
}
return "not found"

从SQL查询中使用它,如下所示:

select find('your-id');

该函数将在表后扫描表以查找your-id。找到表后,它将打印匹配your-id的所有行的ROWID。它会返回类似的内容:

found in table Products in rows with following ROWID: 345, 4647, 32546

然后你可以使用那些ROWID查询Products表:

select * from Products where rowid in (345, 4647, 32546);

如果找不到your-id,那么find的结果将为:not found

答案 1 :(得分:0)

将此Shell脚本写入名为dbSearchString.sh的文件:

#!/bin/sh

searchFor="$1"
db="$2"

sqlite3 "$db" .tables | while read table; do
    output=`sqlite3 -line "$db" "select * from $table" | grep "$searchFor"`
    if [[ "$?" -eq 0 ]]; then
        echo "Found in ${table}:"
        echo "$output"
    fi
done

然后像这样使用它:

$ dbSearchString.sh "text to search for" database.db