2012-01-10 14 views
16

मैं PostgreSQL arrays में किसी मान की स्थिति कैसे प्राप्त कर सकता हूं? PHP के लिए .index() विधि और PHP के लिए array_search() फ़ंक्शन है, लेकिन मुझे PostgreSQL के लिए ऐसा कोई फ़ंक्शन नहीं मिल रहा है। क्या मुझे ऐसा करने के लिए एक संग्रहीत फ़ंक्शन लिखना चाहिए? मैं एक अंतर्निहित फ़ंक्शन का उपयोग करके हल करना पसंद करता हूं।PostgreSQL arrays में किसी मान की स्थिति ढूँढना

उत्तर

9

Since version 9.5, कार्यों में निर्मित किया गया है: array_position() और array_positions(), सरणी कुंजी (केवल पहली घटना) या कुंजी (सभी घटनाओं) को मूल्य के आधार पर खोजने के लिए।

ये फ़ंक्शन किसी भी प्रकार का समर्थन करता है।

27

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 
+0

gener_subscripts() और एक बहुत ही पूर्ण उत्तर के लिए +1। –

+2

अच्छा जवाब। पोस्टग्रेएसक्यूएल 9.4 'ऑर्डिनल' फ़ंक्शंस के साथ 'ऑर्डिनल' के साथ 'अनन्य (the_array) लिखने की इजाजत देता है, यह सरल और अधिक कुशल हो जाएगा। शायद मुझे 9.4 के लिए उचित 'idx' फ़ंक्शन लिखना और सबमिट करना चाहिए, हालांकि ... –

4

पूर्णांक सरणियों के लिए केवल आप बहुत तेजी से idx function from the intarray bundled extension उपयोग कर सकते हैं, NULL तत्वों को खोजने के लिए सक्षम होने के लिए।

यह फ़ंक्शन अभी तक सभी सरणी प्रकारों का समर्थन करने के लिए सामान्यीकृत नहीं किया गया है, दुर्भाग्यवश, इसलिए आप अन्य सरणी के लिए बहुत धीमे SQL दृष्टिकोण से फंस गए हैं।