2011-11-08 9 views
8

स्टोर प्रक्रिया के अंदर तारों में अल्पविराम से अलग स्ट्रिंग को कैसे विभाजित करें और उन्हें तालिका फ़ील्ड में डालें?संग्रहित प्रक्रिया के अंदर अल्पविराम से अलग स्ट्रिंग को कैसे विभाजित करें?

Firebird 2.5

उत्तर

10

यहां नमूने कैसे स्ट्रिंग विभाजित करने के लिए और WRI एक टेबल में उप-तार ते:

create procedure SPLIT_STRING (
    AINPUT varchar(8192)) 
as 
declare variable LASTPOS integer; 
declare variable NEXTPOS integer; 
declare variable TEMPSTR varchar(8192); 
begin 
    AINPUT = :AINPUT || ','; 
    LASTPOS = 1; 
    NEXTPOS = position(',', :AINPUT, LASTPOS); 
    while (:NEXTPOS > 1) do 
    begin 
    TEMPSTR = substring(:AINPUT from :LASTPOS for :NEXTPOS - :LASTPOS); 
    insert into new_table("VALUE") values(:TEMPSTR); 
    LASTPOS = :NEXTPOS + 1; 
    NEXTPOS = position(',', :AINPUT, LASTPOS); 
    end 
    suspend; 
end 
+0

ठंडा। आपका बहुत बहुत धन्यवाद। –

+0

बस ध्यान दें: यह 'एआईएनपीयूटी' के लिए '', 1,2'' 'के लिए कोई परिणाम नहीं लौटाएगा, लेकिन यह 'एआईपीपीयूटी' के लिए तीन सबस्ट्रिंग वापस करेगा जैसे' 1,2, ''। – Wodzu

4

उपयोग स्थिति http://www.firebirdsql.org/refdocs/langrefupd21-intfunc-position.html

और

SUSTRING देर में http://www.firebirdsql.org/refdocs/langrefupd21-intfunc-substring.html

कार्यों का उपयोग करते हुए बयान

+0

आपका स्वागत प्रकाशित! हालांकि यह सैद्धांतिक रूप से प्रश्न का उत्तर दे सकता है, [यह बेहतर होगा] (http://meta.stackexchange.com/q/8259) यहां उत्तर के आवश्यक हिस्सों को शामिल करने के लिए, और संदर्भ के लिए लिंक प्रदान करें। धन्यवाद – codingbadger

10

मैं माइकल के संस्करण संशोधित पोस्ट कर रहा हूँ, शायद यह किसी के लिए उपयोगी होगा।

परिवर्तन कर रहे हैं:

  1. SPLIT_STRING एक चयन प्रक्रिया है।
  2. कस्टम डेलीमीटर संभव है।
  3. यह उन मामलों को भी पार करता है जब delimiter P_STRING में पहला अक्षर होता है।
set term^; 
create procedure split_string (
    p_string varchar(32000), 
    p_splitter char(1)) 
returns (
    part varchar(32000) 
) 
as 
    declare variable lastpos integer; 
    declare variable nextpos integer; 
begin 
    p_string = :p_string || :p_splitter; 
    lastpos = 1; 
    nextpos = position(:p_splitter, :p_string, lastpos); 
    if (lastpos = nextpos) then 
     begin 
      part = substring(:p_string from :lastpos for :nextpos - :lastpos); 
      suspend; 
      lastpos = :nextpos + 1; 
      nextpos = position(:p_splitter, :p_string, lastpos); 
     end 
    while (:nextpos > 1) do 
     begin 
      part = substring(:p_string from :lastpos for :nextpos - :lastpos); 
      lastpos = :nextpos + 1; 
      nextpos = position(:p_splitter, :p_string, lastpos); 
      suspend; 
     end 
end^ 
set term ;^
+0

ग्रेट जॉब @ मार्टजिनपेटर्स :) – hims056

+0

धन्यवाद @ मार्टिजन पाइटर। – Wodzu

3

यह, एक बात को छोड़कर अच्छा लग रहा है 32000 कारण करने के लिए अपने Firebird सर्वर Varchar आकार घोषणा में "कार्यान्वयन सीमा पार हो गई" अपवाद समय सावधानी रखें। मैं बजाय ब्लॉब SUB_TYPE पाठ :) का उपयोग करने का सुझाव देते हैं

2

ऐसा ही एक समाधान मैं का उपयोग करें, कुछ समय पहले जिरी Cincura द्वारा स्टैक ओवरफ़्लो के http://blog.cincura.net/232347-tokenize-string-in-sql-firebird-syntax/

recreate procedure Tokenize(input varchar(1024), token char(1)) 
returns (result varchar(255)) 
as 
declare newpos int; 
declare oldpos int; 
begin 
    oldpos = 1; 
    newpos = 1; 
    while (1 = 1) do 
    begin 
    newpos = position(token, input, oldpos); 
    if (newpos > 0) then 
    begin 
     result = substring(input from oldpos for newpos - oldpos); 
     suspend; 
     oldpos = newpos + 1; 
    end 
    else if (oldpos - 1 < char_length(input)) then 
    begin 
     result = substring(input from oldpos); 
     suspend; 
     break; 
    end 
    else 
    begin 
     break; 
    end 
    end 
end 
संबंधित मुद्दे