如何在Firebird上的所有表中搜索值?
知道一个值,我需要找到它出现的所有表和列。有人能帮帮我吗?我不知道从哪里开始。
我用的是Firebird 3.0。
没有内置的方法可以做到这一点,您需要显式地查询所有表的所有(相关)列来实现这一点。从kamil在查找具有特定值的表和列中的不工作代码中获得灵感,您可以这样做:
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 * 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
(当然,您可以使用与=
不同的条件,例如,如果您想检查包含search_value
的列,则使用containing ?
)。
可以通过只选择适当类型的列来进一步改进上面的内容,等等。当然,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')