आप जो करने की कोशिश कर रहे हैं वह शायद ही पूरी तरह से संभव हो।
डायनेमिक SQL बनाएं
सबसे पहले, यह है कि आप कर सकते हैं do:एक plpgsql फ़ंक्शन जो ऐसी क्वेरी के लिए SQL बनाता है:
CREATE OR REPLACE FUNCTION f_union_common_col_sql(text, text)
RETURNS text
AS $function$
DECLARE
_cols text;
BEGIN
_cols := string_agg(attname, ', ')
FROM (
SELECT a.attname
FROM pg_attribute a
WHERE a.attrelid = $1::regclass::oid
AND a.attnum >= 1
INTERSECT
SELECT a.attname
FROM pg_attribute a
WHERE a.attrelid = $2::regclass::oid
AND a.attnum >= 1
) x;
RETURN 'SELECT ' || _cols || '
FROM ' || quote_ident($1) || '
UNION
SELECT ' || _cols || '
FROM ' || quote_ident($1);
END;
$function$ LANGUAGE plpgsql;
COMMENT ON FUNCTION f_union_common_col_sql(text, text) IS 'Create SQL to query all visible columns that two tables have in common.
# Without duplicates. Use UNION ALL if you want to include duplicates.
# Depends on visibility dicatated by search_path
$1 .. table1: optionally schema-qualified, case sensitive!
$2 .. table2: optionally schema-qualified, case sensitive!';
कॉल करें:
SELECT f_union_common_col_sql('myschema1.tbl1', 'myschema2.tbl2');
आपको पूरी क्वेरी देता है। इसे दूसरी कॉल में निष्पादित करें।
आप यहां plpgsql फंक्शन्स पर मैनुअल .
एग्रीगेट फंक्शन string_agg()
PostgreSQL 9.0 के साथ पेश किया गया था। पुराने संस्करणों में आप:array_to_string(array_agg(attname), ', ')
।
डायनेमिक SQL निष्पादित करें?
इसके बाद, यह वही है जो आप शायद ही कर सकते हैं करो:
CREATE OR REPLACE FUNCTION f_union_common_col(text, text)
RETURNS SETOF record AS
$BODY$
DECLARE
_cols text;
BEGIN
_cols := string_agg(attname, ', ')
FROM (
SELECT a.attname
FROM pg_attribute a
WHERE a.attrelid = $1::regclass::oid
AND a.attnum >= 1
INTERSECT
SELECT a.attname
FROM pg_attribute a
WHERE a.attrelid = $2::regclass::oid
AND a.attnum >= 1
) x;
RETURN QUERY EXECUTE '
SELECT ' || _cols || '
FROM quote_ident($1)
UNION
SELECT ' || _cols || '
FROM quote_ident($2)';
END;
$BODY$
LANGUAGE plpgsql VOLATILE;
COMMENT ON FUNCTION f_union_common_col(text, text) IS 'Query all visible columns that two tables have in common.
# Without duplicates. Use UNION ALL if you want to include duplicates.
# Depends on visibility dicatated by search_path
# !BUT! you need to specify a column definition list for every call. So, hardly useful.
$1 .. table1 (optionally schema-qualified)
$2 .. table1 (optionally schema-qualified)';
फ़ंक्शन कॉल के लिए आपको लक्ष्य स्तंभों की सूची निर्दिष्ट करने की आवश्यकता होती है। इसलिए यह बिल्कुल भी उपयोगी नहीं है:
SELECT * from f_union_common_col('myschema1.tbl1', 'myschema2.tbl2')
ERROR: a column definition list is required for functions returning "record"
इसके आसपास कोई आसान रास्ता नहीं है। आपको गतिशील रूप से एक फ़ंक्शन या कम से कम एक जटिल प्रकार बनाना होगा। मैं यहीं रुकता हूं।