2010-09-16 18 views
7

में एक क्वेरी से एक सीमांकित स्ट्रिंग बनाएं I iSeries (AS/400) पर डीबी 2 में एक क्वेरी के परिणामों से एक सीमित स्ट्रिंग बनाने की कोशिश कर रहा हूं। मैंने इसे टी-एसक्यूएल में किया है, लेकिन इसे यहां करने का कोई तरीका नहीं मिल रहा है।डीबी 2

टी-एसक्यूएल में मेरा कोड यहां है। मैं डीबी 2 में एक समकक्ष की तलाश में हूं। 1
वर्णन

वर्णन 2
वर्णन 3

तो यह इस वापस आ जाएगी:

DECLARE @a VARCHAR(1000) 
SELECT @a = COALESCE(@a + ', ' + [Description], [Description]) 
FROM AP.Checkbooks 
SELECT @a 

मेरी तालिका में वर्णन इस तरह देखें तो

डीएससी 1, डीएससी 2, डीएससी 3

+0

MySQL में, यह 'GROUP_CONCAT()' होगा। –

उत्तर

0

मैं मैं ओएलईडीबी में ऐसा करने की कोशिश कर रहा हूं और जो कुछ मैं समझता हूं उससे आप ऐसा नहीं कर सकते क्योंकि आप ओएलईडीबी के लिए एसक्यूएल में कुछ भी नहीं कर सकते हैं जैसे वैरिएबल घोषित करना या टेबल बनाना। तो मुझे लगता है कि कोई रास्ता नहीं है।

+1

मुझे यकीन नहीं है कि यह मेरे उत्तर पर टिप्पणी करने के लिए था, लेकिन मेरा जवाब चर घोषित नहीं करता है या टेबल बना देता है। यह हो सकता है कि 'XMLAGG' आपके लिए उपलब्ध नहीं है, हालांकि। – CanSpice

+0

सही, मुझे लगता है कि मेरे पास XMLAGG नहीं है, क्योंकि यह ओएलडीडीबी क्वेरी में जो कुछ भी है उसे पहचान नहीं पाता है। –

+0

वह डेटाबेस फ़ंक्शन का उपयोग कर सकता है –

31

अनिवार्य रूप से आप डीबी 2 में MySQL के GROUP_CONCAT कुल फ़ंक्शन के बराबर की तलाश में हैं। one thread I found के अनुसार, आप XMLAGG समारोह द्वारा जाकर ही इस व्यवहार की नकल कर सकते हैं:

create table t1 (num int, color varchar(10)); 

insert into t1 values (1,'red'), (1,'black'), (2,'red'), (2,'yellow'), (2,'green'); 

select num, 
    substr(xmlserialize(xmlagg(xmltext(concat(', ', color))) as varchar(1024)), 3) 
    from t1 
    group by num; 

यह वापसी होगी

1 red,black 
2 red,yellow,green 

(या होना चाहिए, अगर मैं चीजों को सही ढंग से पढ़ रहा हूँ)

+2

+1, साइड टिप्पणी: यदि आप ज़ेड/ओएस v10 पर चल रहे हैं, तो 'varchar (1024) 'to' को clob (1024) ' –

+1

के रूप में बदलें, मैं इसे वर्षों से ढूंढ रहा हूं। यह वही काम करता है जो मुझे चाहिए। धन्यवाद। –

1

आप सामान्य तालिका अभिव्यक्तियों (सीटीई) और रिकर्सन का उपयोग करके ऐसा कर सकते हैं।

with                 
    cte1 as                
     (select description, row_number() over() as row_nbr from checkbooks), 

    cte2 (list, cnt, cnt_max) AS        
     (SELECT VARCHAR('', 32000), 0, count(description) FROM cte1 
     UNION ALL               
     SELECT 
      -- No comma before the first description 
      case when cte2.list = '' THEN RTRIM(CHAR(cte1.description)) 
        else cte2.list || ', ' || RTRIM(CHAR(cte1.description)) end, 
        cte2.cnt + 1, 
        cte2.cnt_max         
     FROM cte1,cte2             
     WHERE cte1.row_nbr = cte2.cnt + 1 AND cte2.cnt < cte2.cnt_max),        

    cte3 as               
     (select list from cte2 
     where cte2.cnt = cte2.cnt_max fetch first 1 row only) 

select list from cte3;