मुझे आपका दूसरा तरीका पसंद है।
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 = '{}')
;
केवल मामूली सुधारों का सुझाव:
-
थोड़े बेहतर प्रदर्शन के लिए सीटीई के बजाय सबक्वेरी।
-
खाली सरणी के लिए सरलीकृत परीक्षण:शाब्दिक
'{}'
. के विरुद्ध जाँच करना फ़ंक्शन कॉल के बजाय। -
सरणी को खोलने के लिए एक कम सबक्वेरी स्तर।
परिणाम:
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
. का उपयोग किया जाएगा पार्श्व क्रॉस जॉइनिंग के बजाय।