मैं PostgreSQL arrays में किसी मान की स्थिति कैसे प्राप्त कर सकता हूं? PHP के लिए .index()
विधि और PHP के लिए array_search()
फ़ंक्शन है, लेकिन मुझे PostgreSQL के लिए ऐसा कोई फ़ंक्शन नहीं मिल रहा है। क्या मुझे ऐसा करने के लिए एक संग्रहीत फ़ंक्शन लिखना चाहिए? मैं एक अंतर्निहित फ़ंक्शन का उपयोग करके हल करना पसंद करता हूं।PostgreSQL arrays में किसी मान की स्थिति ढूँढना
उत्तर
Since version 9.5, कार्यों में निर्मित किया गया है: array_position()
और array_positions()
, सरणी कुंजी (केवल पहली घटना) या कुंजी (सभी घटनाओं) को मूल्य के आधार पर खोजने के लिए।
ये फ़ंक्शन किसी भी प्रकार का समर्थन करता है।
generate_subscripts
फ़ंक्शन का उपयोग कर documentation recommends। अनुकरण के PHP के array_search
नीचे समारोह:
CREATE FUNCTION array_search(needle ANYELEMENT, haystack ANYARRAY)
RETURNS INT AS $$
SELECT i
FROM generate_subscripts($2, 1) AS i
WHERE $2[i] = $1
ORDER BY i
$$ LANGUAGE sql STABLE;
यह पहला मैच के सूचकांक देता है, यदि है। यदि आप सभी मैचों को चाहते हैं, तो बस RETURNS INT
से RETURNS SETOF INT
बदलें। यह फ़ंक्शन, जैसा कि कोई मिलान नहीं मिला है, NULL
देता है।
यह फ़ंक्शन केवल एक-आयामी सरणी के साथ काम करता है।
साथ ही, ध्यान भालू array_search(NULL, a)
हमेशा NULL
देता है कि, भले ही सरणी अशक्त तत्व शामिल हैं:
> SELECT array_search(null, array[1, 2, null, 4]);
array_search
--------------
(1 row)
इसका कारण यह है एसक्यूएल NULL = NULL
समझता है हो रहा है अज्ञात (अर्थात NULL
)। functions-comparison देखें। आप array_search
चाहते हैं बदल
WHERE $2[i] = $1
को
WHERE $2[i] IS NOT DISTINCT FROM $1
पूर्णांक सरणियों के लिए केवल आप बहुत तेजी से idx
function from the intarray
bundled extension उपयोग कर सकते हैं, NULL
तत्वों को खोजने के लिए सक्षम होने के लिए।
यह फ़ंक्शन अभी तक सभी सरणी प्रकारों का समर्थन करने के लिए सामान्यीकृत नहीं किया गया है, दुर्भाग्यवश, इसलिए आप अन्य सरणी के लिए बहुत धीमे SQL दृष्टिकोण से फंस गए हैं।
gener_subscripts() और एक बहुत ही पूर्ण उत्तर के लिए +1। –
अच्छा जवाब। पोस्टग्रेएसक्यूएल 9.4 'ऑर्डिनल' फ़ंक्शंस के साथ 'ऑर्डिनल' के साथ 'अनन्य (the_array) लिखने की इजाजत देता है, यह सरल और अधिक कुशल हो जाएगा। शायद मुझे 9.4 के लिए उचित 'idx' फ़ंक्शन लिखना और सबमिट करना चाहिए, हालांकि ... –