Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

जहां अपेक्षित था, कीवर्ड से नहीं मिला, पाठ चयन Oracle SQL

संयोजन के परिणाम के लिए दिए गए दो उपनाम होने के कारण तत्काल त्रुटि होती है:आपके पास AS LIST as ids है . आप गणना के परिणाम में दो उपनाम नहीं दे सकते। यदि आप चाहते हैं कि नव निर्मित तालिका में एक कॉलम हो LIST फिर as ids हटाएं , और इसके विपरीत।

फिर आप एक और त्रुटि में भाग लेंगे:आप ORDER BY t1.a एकत्रीकरण में। वह काम नहीं करेगा; आप एक्सएमएल एकत्रीकरण में सीएलओबी द्वारा ऑर्डर नहीं कर सकते हैं। क्या आप वाकई परवाह करते हैं कि एकत्रीकरण किस क्रम में होता है? यदि आप नहीं करते हैं, तो ORDER BY NULL . में बदलें . यदि आप परवाह करते हैं, तो आपको एक समस्या है, क्योंकि Oracle में एक order_by_clause . है बस एक CLOB अभिव्यक्ति द्वारा आदेश नहीं दे सकता। आपको अन्य तरीकों का उपयोग करके ऑर्डर करने के लिए एक अलग कॉलम बनाना होगा।

समग्र रूप से समाधान में, खंड के साथ की कोई आवश्यकता नहीं है। जहां भी आप क्वेरी में "input_strings" का उल्लेख करते हैं (विथ क्लॉज के अलावा), बस "table_expressions" लिखें।

संपादित करें

यहां बताया गया है कि इसे कैसे काम किया जा सकता है। सबसे पहले मैं CREATE TABLE स्टेटमेंट दिखाऊंगा। मैं मान लूंगा कि table_expressions खोज स्ट्रिंग्स का एक CLOB कॉलम है, और इस कॉलम में कोई डुप्लीकेट नहीं है। फिर भी, तालिका को डेटा प्रकार की एक अलग प्राथमिक कुंजी की भी आवश्यकता होती है, जो LOB या अन्य लंबी, गैर-मानक-प्रकार नहीं है। मैं इसके लिए NUMBER का उपयोग करता हूं।

फिर मैं इस प्राथमिक कुंजी कॉलम द्वारा एकत्रित करता हूं। काश, मैं एक ही समय में खोज स्ट्रिंग का चयन नहीं कर पाता। मैं SELECT MAX(t2.a) लेकिन वह CLOB मूल्यों के साथ भी काम नहीं करता है! इसके बजाय, मुझे खोज स्ट्रिंग की प्राथमिक कुंजी से मिलान करने के लिए एक और जुड़ाव की आवश्यकता है। (क्षमा करें, इस वजह से क्वेरी में इतना अधिक समय लगेगा...)

एकत्रीकरण में, मैं कॉलम a . से स्ट्रिंग मान के पहले 4000 वर्णों के आधार पर छाँटता हूँ . यह संपूर्ण इनपुट स्ट्रिंग द्वारा सॉर्ट करने जितना अच्छा नहीं है, लेकिन यह अभी भी NULL द्वारा ऑर्डर करने से बेहतर है।

create table a_x ( a, b ) as
  select to_clob('atveroeosipsumloremipsumdolor'), 1 from dual union all
  select to_clob('stetclitakasdtest')            , 2 from dual union all
  select to_clob('noseatakimataatveroeosipsum')  , 3 from dual union all
  select to_clob('loremipsumdolor')              , 4 from dual union all
  select to_clob('consetetursadipscingelitr')    , 5 from dual
;

create table table_expressions ( a, pk ) as 
 select to_clob('atveroeosipsum') , 10 from dual union all 
 select to_clob('test') , 11 from dual union all 
 select to_clob('stetclitakasd') , 12 from dual union all 
 select to_clob('noseatakimata') , 13 from dual union all 
 select to_clob('loremipsumdolor') , 14 from dual union all 
 select to_clob('consetetursadipscingelitr'), 15 from dual 
 ;

create table a_y as
select te.a, s.ids
from   table_expressions te 
       join
       (select   t2.pk, RTRIM(XMLAGG(XMLELEMENT(E,t1.a,',').EXTRACT('//text()') 
                     ORDER BY cast(t1.a as varchar2(4000))).GetClobVal(),',') as ids
        from     a_x t1 
         join table_expressions t2 
          on t1.a like '%' || t2.a || '%'
         group by t2.pk
       ) s
on te.pk = s.pk
;

अब देखते हैं कि हमें क्या मिला:

select * from a_y;

A                          IDS
-------------------------  ---------------------------------------------------------
atveroeosipsum             atveroeosipsumloremipsumdolor,noseatakimataatveroeosipsum
test                       stetclitakasdtest
stetclitakasd              stetclitakasdtest
noseatakimata              noseatakimataatveroeosipsum
loremipsumdolor            atveroeosipsumloremipsumdolor,loremipsumdolor
consetetursadipscingelitr  consetetursadipscingelitr

#2 संपादित करें

यदि आपको आईडी को तालिका a_x . से जोड़ना है (स्तंभ b ), स्वयं CLOB नहीं, फिर t1.a . को बदलें t1.b . के साथ (और, ORDER BY . में XMLAGG . का खंड , आपको किसी cast की आवश्यकता नहीं है , बस order by t1.b )।

drop table a_y purge;

create table a_y as
select te.a, s.ids
from   table_expressions te 
       join
       (select   t2.pk, RTRIM(XMLAGG(XMLELEMENT(E,t1.b,',').EXTRACT('//text()') 
                     ORDER BY t1.b).GetClobVal(),',') as ids
        from     a_x t1 
         join table_expressions t2 
          on t1.a like '%' || t2.a || '%'
         group by t2.pk
       ) s
on te.pk = s.pk
;

select * from a_y;

A                          IDS
-------------------------  ---
atveroeosipsum             1,3
test                       2
stetclitakasd              2
noseatakimata              3
loremipsumdolor            1,4
consetetursadipscingelitr  5



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle/SQL - अनुक्रमिक रिकॉर्ड की निर्दिष्ट श्रेणी का चयन करें

  2. Oracle में SQL के साथ JSON डेटा में हेरफेर

  3. पैरामीटरयुक्त ऑरैकल सम्मिलित क्वेरी कैसे लिखें?

  4. एक विशिष्ट दिनांक प्रारूप की नियमित अभिव्यक्ति

  5. मुझे बताएं कि QUERY के माध्यम से रास्पबेरी पाई से OracleDB का उपयोग कैसे करें