आप दिए गए C फ़ंक्शन का उपयोग कर सकते हैं crosstab_hash
इसके लिए।
इस संबंध में नियमावली बहुत स्पष्ट नहीं है। इसका उल्लेख अध्याय के अंत में crosstab()
. पर किया गया है दो पैरामीटर के साथ:
प्रत्येक क्वेरी में परिणाम कॉलम नाम और प्रकार लिखने से बचने के लिए आप पूर्वनिर्धारित फ़ंक्शन बना सकते हैं। पिछले अनुभाग में उदाहरण देखें। crosstab
. के इस रूप के लिए अंतर्निहित C फ़ंक्शन नाम दिया गया है crosstab_hash
।
आपके उदाहरण के लिए:
CREATE OR REPLACE FUNCTION f_cross_test_db(text, text)
RETURNS TABLE (kernel_id int, key1 int, key2 int, key3 int)
AS '$libdir/tablefunc','crosstab_hash' LANGUAGE C STABLE STRICT;
कॉल करें:
SELECT * FROM f_cross_test_db(
'SELECT kernel_id, key, value FROM test_db ORDER BY 1,2'
,'SELECT DISTINCT key FROM test_db ORDER BY 1');
ध्यान दें कि आपको एक अलग crosstab_hash
. बनाना होगा प्रत्येक crosstab
. के लिए फ़ंक्शन एक अलग रिटर्न प्रकार के साथ कार्य करें।
संबंधित:
- पोस्टग्रेएसक्यूएल पंक्ति से कॉलम तक
आपका स्तंभ सूची बनाने का कार्य बल्कि जटिल है, परिणाम गलत है (int
kernel_id
. के बाद गायब है ), इसे इस SQL क्वेरी से बदला जा सकता है:
SELECT 'kernel_id int, '
|| string_agg(DISTINCT key::text, ' int, ' ORDER BY key::text)
|| ' int, DUMMY text'
FROM test_db;
और इसे वैसे भी गतिशील रूप से उपयोग नहीं किया जा सकता है।