我使用SQLiteStudio查看和测试sqlite数据库,这意味着我无法访问fts3或fts4。
我有一个我需要从数据库中找到的ID,并且不知道它属于哪45个表。是否有可以运行的查询将返回它所属的表名?
答案 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