大規模で恐ろしく構築されたデータベースがあり、特定のデータを見つけてそのテーブルと列を知らせるためにクエリを実行しています。最終的にではなく、何かを見つけるたびにクエリがデータを返すようにする方法はありますか?以下Postgresql:検索結果の末尾に見つからない結果を返します
特定のテーブルで興味のある方
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)';
私はこれを試してみましょう、私は少なくともこの感謝を理解する! –
btwは試してみました。ありがとう!! –