gpt4 book ai didi

sql - Postgresql:返回未在搜索结束时找到的结果

转载 作者:行者123 更新时间:2023-11-29 13:22:50 24 4
gpt4 key购买 nike

我有一个庞大的、结构糟糕的数据库,我正在通过它运行查询以查找特定数据并让我知道它的表和列。有没有办法让查询在每次找到东西而不是最后都返回数据?

下面是有兴趣者的查询

CREATE OR REPLACE FUNCTION search_columns(
needle text,
haystack_tables name[] default '{}',
haystack_schema name[] default '{public}'
)
RETURNS table(schemaname text, tablename text, columnname text, rowctid text)
AS $$
begin
FOR schemaname,tablename,columnname IN
SELECT c.table_schema,c.table_name,c.column_name
FROM information_schema.columns c
JOIN information_schema.tables t ON
(t.table_name=c.table_name AND t.table_schema=c.table_schema)
WHERE (c.table_name=ANY(haystack_tables) OR haystack_tables='{}')
AND c.table_schema=ANY(haystack_schema)
AND t.table_type='BASE TABLE'
LOOP
EXECUTE format('SELECT ctid FROM %I.%I WHERE cast(%I as text)=%L',
schemaname,
tablename,
columnname,
needle
) INTO rowctid;
IF rowctid is not null THEN
RETURN NEXT;
END IF;
END LOOP;
END;
$$ language plpgsql;

--Search in all tables within public schema:
select * from search_columns('E0801');

在特定表中搜索:

select * from search_columns('foobar','{w}');

在从选择中获得的表子集中搜索:

select * from 
grep_columns('foobar', array(select table_name::name from information_schema.tables where table_name like 's%'), array['public']);

得到对应基表和ctid的结果行:

select * from public.w where ctid='(0,2)';

最佳答案

只要您的客户端程序异步显示通知,您就可以使用RAISE NOTICE

RETURN NEXT 之前插入 RAISE NOTICE 并在 psql 中尝试:

...
IF rowctid is not null THEN
RAISE NOTICE '% % % %', schemaname, tablename, columnname, rowctid;
RETURN NEXT;
END IF;
...

关于sql - Postgresql:返回未在搜索结束时找到的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38750164/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com