2009-12-31 15 views
16

में तालिका में अंतरिक्ष से मैं regexp_split_to_table की तरह एक समारोह के लिए देख रहा है, लेकिन हमारे डाटाबेस, संस्करण 8.2.9 है तो यह यह नहीं है। मैं एक स्थान पर वास्तव में केवल बंटवारे हूँ, इसलिएएसक्यूएल विभाजन स्ट्रिंग PostgreSQL

how now brown cow

इस तरह की स्ट्रिंग

+------+ 
|Column| 
+------+ 
|how | 
|now | 
|brown | 
|cow | 
+------+ 

वापसी होगी तो इसे आसानी से समारोह है कि इस संभाल सकता है, या कुछ मेरे पास है अपने आप को लिखने के लिए?

उत्तर

34

आप अनन्य फ़ंक्शन का उपयोग करके एक सरणी को एक परिणाम में विभाजित कर सकते हैं, और आप string_to_array फ़ंक्शन का उपयोग करके एक स्ट्रिंग अक्षर को सरणी में बदल सकते हैं। दोनों गठबंधन और आप इस मिल:

alvherre=# select unnest(string_to_array('the quick lazy fox', ' ')); 
unnest 
-------- 
the 
quick 
lazy 
fox 
(4 filas) 

8,2 के बाद से UNNEST नहीं है, आप इसे PostgreSQL में इस प्रकार लिख सकते हैं:

create or replace function unnest(anyarray) returns setof anyelement 
language sql as $$ 
    select $1[i] from generate_series(array_lower($1, 1), 
            array_upper($1, 1)) as i; 
$$; 
+0

+1। – pilcrow

2

मुझे लगता है कि आप RETURNS SET या RETURNS TABLE खुद करना होगा।

अपडेट किया गया जवाब: का उपयोग कर PL/pgSQL:

pg=> CREATE OR REPLACE FUNCTION string_to_rows(text) RETURNS SETOF TEXT AS $$ 
    DECLARE 
    elems text[];  
    BEGIN 
    elems := string_to_array($1, ' '); 
    FOR i IN array_lower(elems, 1) .. array_upper(elems, 1) LOOP 
     RETURN NEXT elems[i]; 
    END LOOP; 
    RETURN; 
    END 
$$ LANGUAGE 'plpgsql'; 
CREATE FUNCTION 

pg=> SELECT "Column" FROM string_to_rows('how now brown cow') d("Column"); 
Column 
-------- 
how 
now 
brown 
cow 
(4 rows) 

मूल जवाब: का उपयोग कर पी एल/पर्ल:

pg=> CREATE LANGUAGE plperl; 
CREATE LANGUAGE 

pg=> CREATE FUNCTION psplit_to_rows(text) RETURNS SETOF TEXT AS $$ 
pg$> for my $t (split ' ', $_[0]) { return_next $t; } 
pg$> undef; 
pg$> $$ LANGUAGE plperl; 
CREATE FUNCTION 

pg=> SELECT "Column" FROM psplit_to_rows('how now brown cow') d("Column"); 
Column 
-------- 
how 
now 
brown 
cow 
(4 rows) 

जाहिर है आप अपने द्वारा चयनित किसी सीमांकक को संभालने के लिए इस विस्तार कर सकते हैं , आदि। (ध्यान दें, मुझे यकीन नहीं है कि क्या आप वास्तव में "कॉलम" नामक कॉलम चाहते थे, जिसके लिए कीवर्ड टकराव से बचने के लिए पहचानकर्ता उद्धरण की आवश्यकता होती है, लेकिन वहां आप हैं।)

+0

मैं के साथ काम करने plperl की जरूरत नहीं है, यह आसानी से किया जा सकता है w/plpgsql किया? – veilig

+0

@veilig, हाँ, अपडेट किया गया। – pilcrow

+0

@pilcrow, आपका फ़ंक्शन बहुत अच्छा काम करता है, लेकिन जब मैं एक क्वेरी निष्पादित करने का प्रयास करता हूं तो मुझे समस्या हो रही है [तालिका से string_to_rows (कॉलम) का चयन करें]। मुझे त्रुटि दे रहा है: त्रुटि: सेट-मूल्यवान फ़ंक्शन संदर्भ में कहा जाता है जो सेट को स्वीकार नहीं कर सकता है। ऑनलाइन चारों ओर देखकर मुझे लगता है कि मुझे string_to_rows (text) से [select * जैसे कॉल करने की आवश्यकता है]। क्या यह फ़ंक्शन कॉल करना और सेट में पास करना संभव है? यानी [string *to_rows से चयन करें (तालिका से कॉल का चयन करें)]। – veilig

संबंधित मुद्दे