PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

किसी फ़ंक्शन के पैरामीटर के रूप में सरणियों की एक सरणी पास करना

मुझे आपका दूसरा तरीका पसंद है।

SELECT DISTINCT t.*
FROM   (VALUES (1, 4), (5, 1), (2, 3), (1, 4), (7, 3), (7, 4)) AS t(a, b)
JOIN   (
   SELECT arr[1]::int[] AS a1
         ,arr[2]::int[] AS b1
   FROM   (
      SELECT unnest(ARRAY['{"{1,2}", "{3,4}"}'
                         ,'{"{}"   , "{4,5,6}"}'
                         ,'{"{5}"  , "{}"}'    -- added element to 1st dimension
                         ])::text[] AS arr     -- 1d text array
      ) sub
   ) s ON (a = ANY(a1) OR a1 = '{}')
      AND (b = ANY(b1) OR b1 = '{}')
;

केवल मामूली सुधारों का सुझाव:

  1. थोड़े बेहतर प्रदर्शन के लिए सीटीई के बजाय सबक्वेरी।

  2. खाली सरणी के लिए सरलीकृत परीक्षण:शाब्दिक '{}' . के विरुद्ध जाँच करना फ़ंक्शन कॉल के बजाय।

  3. सरणी को खोलने के लिए एक कम सबक्वेरी स्तर।

परिणाम:

a | b
--+---
2 | 3
7 | 4
1 | 4
5 | 1

आकस्मिक पाठक के लिए:पूर्णांक के बहु-आयामी सरणी को लपेटना आवश्यक है, क्योंकि पोस्टग्रेज़ की मांग है कि (त्रुटि संदेश उद्धृत करते हुए):

एक वैकल्पिक मार्ग एक 2-आयामी टेक्स्ट सरणी के साथ होगा और generate_subscripts() . का उपयोग करके इसे अननेस्ट करें :

WITH a(arr) AS (SELECT '{{"{1,2}", "{3,4}"}
                        ,{"{}", "{4,5,6}"}
                        ,{"{5}", "{}"}}'::text[]   -- 2d text array
             )
SELECT DISTINCT t.*
FROM  (VALUES (1, 4), (5, 1), (2, 3), (1, 4), (7, 3), (7, 4)) AS t(a, b)
JOIN  (
   SELECT arr[i][1]::int[] AS a1
         ,arr[i][2]::int[] AS b1
   FROM   a, generate_subscripts(a.arr, 1) i       -- using implicit LATERAL
   ) s ON (t.a = ANY(s.a1) OR s.a1 = '{}')
      AND (t.b = ANY(s.b1) OR s.b1 = '{}');

तेज़ हो सकता है, क्या आप परीक्षण कर सकते हैं?

9.3 से पहले के संस्करणों में एक स्पष्ट CROSS JOIN . का उपयोग किया जाएगा पार्श्व क्रॉस जॉइनिंग के बजाय।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. पैरामीटर NULL होने पर WHERE क्लॉज से शर्तों को कैसे हटाएं

  2. PostgreSQL में महीने के नाम को महीने की संख्या में बदलें

  3. मैं अपने मूल असेंबली के साथ बेचे गए घटकों की मात्रा की गणना करने के लिए SQL क्वेरी कैसे लिख सकता हूं? (पोस्टग्रेस 11/रिकर्सिव सीटीई?)

  4. डॉकर अमान्य प्राथमिक चेकपॉइंट रिकॉर्ड पोस्ट करता है

  5. रेल - कस्टम-नामित संघों के साथ जुड़ने का उपयोग करना