【发布时间】:2023-01-19 22:34:08
【问题描述】:
如何在 Firebird 的所有表中搜索一个值?
知道一个值,我需要找到它出现的所有表和列。 有人可以帮我吗?我不知道从哪里开始。
我正在使用火鸟 3.0。
【问题讨论】:
-
没有内置的方法可以做到这一点,您需要显式查询所有表的所有(相关)列才能实现这一点。也许你可以从这个问题中得到启发:Find tables, columns with specific value
如何在 Firebird 的所有表中搜索一个值?
知道一个值,我需要找到它出现的所有表和列。 有人可以帮我吗?我不知道从哪里开始。
我正在使用火鸟 3.0。
【问题讨论】:
没有内置的方法可以做到这一点,您需要显式查询所有表的所有(相关)列才能实现这一点。从 kamil 在 Find tables, columns with specific value 中的无效代码中获得灵感,你可以这样做:
execute block
returns (
table_name varchar(63),
column_name varchar(63))
as
declare search_value varchar(30) = 'John';
declare has_result boolean;
begin
for select trim(r.rdb$relation_name), trim(f.rdb$field_name)
from rdb$relation_fields f
join rdb$relations r on f.rdb$relation_name = r.rdb$relation_name
and r.rdb$view_blr is null
and (r.rdb$system_flag is null or r.rdb$system_flag = 0)
order by r.rdb$relation_name, f.rdb$field_position
into :table_name, :column_name
do
begin
execute statement ('select exists(SELECT 1 FROM "' || table_name || '" where "' || column_name || '" = ?) from rdb$database') (search_value)
into has_result;
if (has_result) then
suspend;
when any do
begin
/* value not comparable with varchar, skip */
end
end
end
这标识哪个表 + 列等于 search_value(但您当然可以使用与 = 不同的条件,例如 containing ? 如果您要检查包含 search_value 的列)。
可以通过仅选择适当类型的列等进一步完善上述内容。当然,varchar(30) 可能并不适合所有情况。
您也可以将其更改为存储过程,例如通过将标题更改为
create procedure search_all(search_value varchar(30))
returns (
table_name varchar(63),
column_name varchar(63))
as
declare has_result boolean;
begin
-- ... rest of code above
然后你可以执行它:
select * from search_all('John')
【讨论】: