यहां एक pl/pgsql फ़ंक्शन है जो रिकॉर्ड को रेखांकित करता है जहां किसी भी कॉलम में एक विशिष्ट मान होता है। यह टेक्स्ट प्रारूप में खोज करने के लिए तर्क, तालिका नामों की एक सरणी (सभी तालिकाओं के लिए डिफ़ॉल्ट) और स्कीमा नामों की एक सरणी (सभी स्कीमा नामों को डिफ़ॉल्ट करता है) के रूप में तर्क के रूप में लेता है।
यह स्कीमा, टेबल के नाम, कॉलम और छद्म स्तंभ ctid
के नाम के साथ एक मेज संरचना देता है (तालिका में पंक्ति के गैर-टिकाऊ भौतिक स्थान, देख System Columns)
CREATE OR REPLACE FUNCTION search_columns(
needle text,
haystack_tables name[] default '{}',
haystack_schema name[] default '{}'
)
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) OR 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;
संपादित : यह कोड पीजी 9.1 या नए के लिए है।एक परीक्षण डेटाबेस में उपयोग की
उदाहरण:
सार्वजनिक योजना के अंतर्गत सभी तालिकाओं में खोजें:
एक विशिष्ट तालिका में
select * from search_columns('foobar');
schemaname | tablename | columnname | rowctid
------------+-----------+------------+---------
public | s3 | usename | (0,11)
public | s2 | relname | (7,29)
public | w | body | (0,2)
(3 rows)
खोज: टेबल के एक सबसेट में
select * from search_columns('foobar','{w}');
schemaname | tablename | columnname | rowctid
------------+-----------+------------+---------
public | w | body | (0,2)
(1 row)
खोजें एक चयन से प्राप्त:
select * from search_columns('foobar', array(select table_name::name from information_schema.tables where table_name like 's%'), array['public']);
schemaname | tablename | columnname | rowctid
------------+-----------+------------+---------
public | s2 | relname | (7,29)
public | s3 | usename | (0,11)
(2 rows)
,
select * from public.w where ctid='(0,2)';
title | body | tsv
-------+--------+---------------------
toto | foobar | 'foobar':2 'toto':1
फिर ग्रेप की तरह सख्त समानता के बजाय एक नियमित अभिव्यक्ति जांचने के लिए इस:
इसी आधार तालिका और और ctid साथ एक परिणाम पंक्ति जाओ
SELECT ctid FROM %I.%I WHERE cast(%I as text)=%L
के लिए बदला जा सकता है:
SELECT ctid FROM %I.%I WHERE cast(%I as text) ~ %L
क्या आप किसी टूल की तलाश कर रहे हैं या लिंक किए गए प्रश्न में दिखाए गए प्रक्रियाओं के कार्यान्वयन के लिए? –
नहीं, सभी फ़ील्ड/टेबल में विशिष्ट मान खोजने का सबसे आसान तरीका है। –
तो आप बाहरी उपकरण का उपयोग नहीं करना चाहते हैं? –