如何在火鸟上的所有表中找到一个值?



如何在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')

相关内容

  • 没有找到相关文章

最新更新