9.5 या नए पोस्ट करें
... कुल फ़ंक्शन के एक अतिरिक्त प्रकार के साथ जहाज array_agg()
. मैनुअल:
इनपुट सरणियों को एक उच्च आयाम की सरणी में संयोजित किया गया है (इनपुट में सभी समान आयाम होने चाहिए, और खाली या शून्य नहीं हो सकते हैं)
तो बिल्कुल कस्टम एग्रीगेट फ़ंक्शन के समान नहीं है array_agg_mult()
नीचे। लेकिन हो सके तो इसका इस्तेमाल करें। यह तेज़ है।
संबंधित:
- PostgreSQL में दो आयामी इंट ऐरे को कैसे सॉर्ट करें?
9.4 या पुराने को पोस्ट करें
किसी भी के लिए समग्र कार्य सरणी प्रकार
बहुरूपी प्रकार के साथ anyarray
यह सभी प्रकार के सरणियों के लिए काम करता है (integer[]
. सहित) ):
CREATE AGGREGATE array_agg_mult (anyarray) (
SFUNC = array_cat
, STYPE = anyarray
, INITCOND = '{}'
);
जैसा कि @ लुकास ने प्रदान किया है, कस्टम फ़ंक्शन arrayappend()
आवश्यकता नहीं है। बिल्ट इन array_cat()
काम करता है। हालांकि, यह स्पष्ट नहीं करता है कि क्यों आपका उदाहरण विफल रहता है, जबकि लुकास के उत्तर में से एक काम करता है। प्रासंगिक अंतर यह है कि लुकास ने सरणी को array[d.a]
के साथ एक अन्य सरणी परत में नेस्ट किया ।
आप गलत धारणा से आगे बढ़ते हैं कि आप एक प्रकार की घोषणा कर सकते हैं int[][]
. लेकिन आप नहीं कर सकते:int[][]
एक ही प्रकार . है int[]
. के रूप में PostgreSQL प्रकार प्रणाली के लिए। मैनुअल में सरणी प्रकारों पर अध्याय बताता है:
वर्तमान कार्यान्वयन घोषित संख्या के आयामों को भी लागू नहीं करता है। आकार या आयामों की संख्या की परवाह किए बिना, किसी विशेष तत्व प्रकार के सभी सरणी एक ही प्रकार के माने जाते हैं। इसलिए, CREATE TABLE
. में सरणी आकार या आयामों की संख्या घोषित करना बस दस्तावेज है; यह रन-टाइम व्यवहार को प्रभावित नहीं करता है।
एक n
-आयामी पूर्णांक सरणी प्रभावी रूप से n-1
. की एक सरणी है PostgreSQL में पूर्णांक के आयामी सरणियाँ। आप उस प्रकार से नहीं बता सकते जो केवल आधार तत्व . को परिभाषित करता है . आपको पूछना है array_dims()
विवरण प्राप्त करने के लिए।
प्रदर्शित करने के लिए:
SELECT array_agg_mult(arr1) AS arr1 --> 1-dim array
, array_agg_mult(ARRAY[arr1]) AS arr2 --> 2-dim array
, array_agg_mult(ARRAY[ARRAY[arr1]]) AS arr3 --> 3-dim array
-- etc.
FROM (
VALUES
('{1,2,3}'::int[]) -- 1-dim array
, ('{4,5,6}')
, ('{7,8,9}')
) t(arr1);
या:
SELECT array_agg_mult(arr2) AS arr2 --> 2-dim array
, array_agg_mult(ARRAY[arr2]) AS arr3 --> 3-dim array
, array_agg(arr2) AS arr3 --> 3-dim array; superior in Postgres 9.5+
FROM (
VALUES
('{{1,2,3}}'::int[]) -- 2-dim array
,('{{4,5,6}}')
,('{{7,8,9}}')
) t(arr2);
सभी परिणामी स्तंभ समान प्रकार के होते हैं :int[]
(भले ही आयामों की संख्या भिन्न हो)।