【问题标题】:How to find a value in all tables on firebird?如何在 firebird 的所有表中找到一个值?
【发布时间】:2023-01-19 22:34:08
【问题描述】:

如何在 Firebird 的所有表中搜索一个值?

知道一个值,我需要找到它出现的所有表和列。 有人可以帮我吗?我不知道从哪里开始。

我正在使用火鸟 3.0。

【问题讨论】:

  • 没有内置的方法可以做到这一点,您需要显式查询所有表的所有(相关)列才能实现这一点。也许你可以从这个问题中得到启发:Find tables, columns with specific value

标签: search firebird


【解决方案1】:

没有内置的方法可以做到这一点,您需要显式查询所有表的所有(相关)列才能实现这一点。从 kamilFind 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')

【讨论】:

    猜你喜欢
    • 2021-09-05
    • 2023-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-06
    • 1970-01-01
    • 2010-11-07
    相关资源
    最近更新 更多