使用PostgreSQL在数据库中的任何位置查找值

lvmkulzt  于 2023-11-18  发布在  PostgreSQL
关注(0)|答案(1)|浏览(177)

我在这篇文章中发现了类似的问题
Find a value anywhere in a database)的最大值
但是当我在使用PostgreSQL服务器的数据库中尝试时,
它不工作
如何使用PostgreSQL服务器进行类似的查询
我正在使用DBeaver执行查询
到目前为止,我使用这个查询来获取表,使用table_name或column_name进行搜索

select table_catalog, table_schema, table_name, column_name
from information_schema.columns
where 1 = 1
--and table_schema  = 'ws_go_daa'
and table_name like '%prism%'
--and column_name like '%itm%'
and column_name  like '%po%'

字符串
感谢你的帮助.

v2g6jxz6

v2g6jxz61#

你在正确的路径上查看了information_schema.columns。你可以在那里获得所有的模式、表和列名,并在它们上面搜索,使用动态语句搜索你的值。Demo at db<>fiddle

create table some_table as select 'some_specific_text_value'::text as some_text_column;
create table another_table as select '1234567890'::int as some_int_column;

create function find_anywhere(
  target_value anyelement, 
  is_type_strict boolean default true,
  is_searching_catalogs boolean default false) 
returns table (table_schema text, table_name text, column_name text, r record)
language plpgsql as $f$
begin
  for table_schema, table_name, column_name in
     select i.table_schema,i.table_name,i.column_name,i.data_type
     from information_schema.columns i
     where (not is_type_strict 
            or i.data_type::text=pg_typeof(target_value)::text)
     and (is_searching_catalogs 
          or i.table_schema not in ('pg_catalog','information_schema'))
  loop
     for r in execute format($q$ select r from %1$I.%2$I r 
                                 where case when $2 
                                 then r.%3$I is not distinct from $1
                                 else r.%3$I::text is not distinct from $1::text
                                 end
                             $q$
                             ,table_schema, table_name, column_name)
              using target_value, is_type_strict
     loop
        return next;
     end loop;
  end loop;
end $f$;

select * from find_anywhere('some_specific_text_value'::text);

字符串
| 表模式|表名|列名|R|
| --|--|--|--|
| 公共|一些表|some_text_column|(“(some_specific_text_value)”)|

select * from find_anywhere(1234567890::int);


| 表模式|表名|列名|R|
| --|--|--|--|
| 公共|另一张table|一些整数列|(“(1234567890)”)|
返回整个匹配记录的原因是为了以后能够精确定位该行。另一种方法是在pg_index中查找非部分唯一索引,并仅返回唯一标识该行的最小列集。
非严格版本也可以通过运行一个target_value::text in (col1::text,col2::text...)而不是逐列检查来摆脱一个非嵌套循环。虽然这仍然会给你给予匹配,但它不会指定匹配的列。
所有类型都可以与text兼容,因此可以删除整个strict逻辑。我认为这是值得保留的性能:查找'2023-11-08'::date不必检查数据库中的所有text。它可以改进以尝试比较类似的类型,无论何时查找date都要检查timestamp,反之亦然。
您可能需要重载它以避免显式强制转换:

select * from find_anywhere('some_specific_text_value');

x

ERROR:  could not determine polymorphic type because input has type unknown
create function find_anywhere(target_value text) 
  returns table (table_schema text, table_name text, column_name text, r record)
language sql as $f$ select find_anywhere($1::text,true,false) $f$;

select * from find_anywhere('some_specific_text_value');

的一种或多种
| 表模式|表名|列名|R|
| --|--|--|--|
| 公共|一些表|some_text_column|(“(some_specific_text_value)”)|

相关问题