डीडीएल कमांड को गतिशील रूप से बनाएं। आप इसे दो चरणों में कर सकते हैं:
-
बिल्ड स्टेटमेंट:
SELECT 'CREATE TABLE why.am_i_doing_this AS SELECT ' || string_agg(column_name, ', ' ORDER BY ordinal_position) || ' FROM original.table' FROM information_schema.columns WHERE table_schema = 'original' AND table_name = 'table' AND column_name NOT IN ('column_1', 'column_2');
-
(जांचें कि यह अच्छा है!) फिर जेनरेट किए गए स्टेटमेंट को सर्वर के दूसरे राउंड ट्रिप में निष्पादित करें।
यह जानकारी स्कीमा दृश्य पर आधारित है information_schema.columns
. वैकल्पिक रूप से, आप pg_catalog.pg_attribute
का उपयोग कर सकते हैं
. संबंधित:
लेकिन यह सर्वर के एक चक्कर में भी किया जा सकता है:
DO
. के साथ किसी भी ग्राहक का बयान
DO
पीएल/पीजीएसक्यूएल कोड के तदर्थ निष्पादन के लिए सिर्फ एक साधारण आवरण है। आप किसी फ़ंक्शन या प्रक्रिया में भी ऐसा ही कर सकते हैं।
DO
$$
BEGIN
EXECUTE (
SELECT 'CREATE TABLE why.am_i_doing_this AS SELECT '
|| string_agg(column_name, ', ' ORDER BY ordinal_position)
|| ' FROM original.table'
FROM information_schema.columns
WHERE table_schema = 'original'
AND table_name = 'table'
AND column_name NOT IN ('column_1', 'column_2')
);
END
$$;
psql मेटा-कमांड के साथ सरल \gexec
चूंकि आपने डिफ़ॉल्ट इंटरैक्टिव टर्मिनल psql
का उल्लेख किया है
. वहां आप \gexec
. का उपयोग कर सकते हैं . यह ...
तो:
SELECT 'CREATE TABLE why.am_i_doing_this AS SELECT '
|| string_agg(column_name, ', ' ORDER BY ordinal_position)
|| ' FROM original.table'
FROM information_schema.columns
WHERE table_schema = 'original'
AND table_name = 'table'
AND column_name NOT IN ('column_1', 'column_2')\gexec