2013-08-15 8 views
21

मेरे पास क्लॉब कॉलम वाला एक टेबल है। क्लोब कॉलम सामग्री के आधार पर खोज करने की आवश्यकता है। हालांकिपूछताछ ऑरैक क्लोब कॉलम

select * from aTable where aClobColumn = 'value';

विफल रहता है लेकिन

select * from aTable where aClobColumn like 'value'; 

workfine लगता है। एक क्लोब कॉलम पर ऑरैकल हैंडल फ़िल्टरिंग कैसे करता है। क्या यह केवल 'पसंद' खंड का समर्थन करता है, न कि =,! = आदि। क्या यह अन्य डेटाबेस जैसे mysql, postgres इत्यादि के साथ समान है

यह परिदृश्य ढांचे में कैसे संभाला जाता है जो जेपीए को हाइबरनेट को लागू करता है?

+0

http://stackoverflow.com/questions/17649011/search-for-a-particular-string-in-oracle इस पर एक नज़र डालें -clob-column – user75ponic

उत्तर

30

हाँ, यह अनुमति =, !=, <> और इतने पर SQL कथन में, जैसे तुलना ऑपरेटरों का उपयोग करने के लिए जब दो CLOB तुलना करने के लिए कोशिश कर रहा है (यह प्रतिबंध PL/SQL में CLOB रों तुलना प्रभावित नहीं करता है) नहीं कर रहा है कॉलम या CLOB कॉलम और एक अक्षर शाब्दिक, जैसा आप करते हैं। SQL कथन में ऐसी तुलना करने में सक्षम होने के लिए, dbms_lob.compare() फ़ंक्शन का उपयोग किया जा सकता है।

select * 
    from aTable 
    where dbms_lob.compare(aClobColumn, 'value') = 0 

ऊपर क्वेरी में, 'value' शाब्दिक परोक्ष CLOB डेटा प्रकार में परिवर्तित हो जाएगा। अंतर्निहित रूपांतरण से बचने के लिए 'value' शाब्दिक स्पष्ट TO_CLOB() समारोह का उपयोग कर CLOB डेटा प्रकार के लिए परिवर्तित किया जा सकता है और उसके बाद compare() समारोह में पारित:

select * 
    from aTable 
    where dbms_lob.compare(aClobColumn, to_clob('value')) = 0 
+0

यह व्यवहार पोस्टग्रेज़ के साथ-साथ –

+0

@DevBlanked PostgreeSQl में 'टेक्स्ट' (कोई 'सीएलओबी' नहीं है) डेटा प्रकार है, और [अनुमति] (http: //www.sqlfiddle) .com/#!1/1 9 3dd/5) आप तुलनात्मक ऑपरेटरों का उपयोग उस डेटा प्रकार के मूल्यों की तुलना एक-दूसरे या एक स्ट्रिंग शाब्दिक से करने के लिए करते हैं। –

+0

सावधान रहें कि "पैरामीटर के लिए पूर्ण या अमान्य इनपुट मानों के साथ कार्य एक पूर्ण लौटाते हैं"। कुछ मामलों में यह महत्वपूर्ण हो सकता है। – Vadzim

1

CLOB के बड़े डेटाटाइप्स कि बड़े पैमाने पर डेटा और इसलिए कई ऑपरेटरों कि varchar कार्य का समर्थन CLOB पर काम नहीं करेगा स्टोर कर सकते हैं कर रहे हैं, लेकिन PL/SQL में उनमें से कुछ की तरह करते हैं यहाँ उल्लेख किया: http://docs.oracle.com/cd/B19306_01/appdev.102/b14249/adlob_sql_semantics.htm#g1016221

आप में देख सकते हैं तालिका Like दोनों Sql और clobs के लिए PL/SQL में समर्थित है, लेकिन = एसक्यूएल में समर्थित नहीं है, लेकिन आप वास्तव में आप की जरूरत है एसक्यूएल में varchar में बदल जाएंगे और टॉम Kyte तरह की तुलना कर सकते PL/SQL

में है here का उल्लेख इस प्रकार है: http://sqlfiddle.com/#!4/1878f6/1

select * from aTable where dbms_lob.substr(aClobColumn , length(aClobColumn), 1)='value'; 
0

तो नहीं है। क्योंकि यदि आप डेटा की तुलना करना चाहते हैं - तो यह एक ऐसी स्थिति हो सकती है जहां एक मान: NULL और दूसरा EMPTY_CLOB और यह इस विधि के लिए अलग-अलग मामला है! यह 1 देता है, हालांकि डेटा के संदर्भ में - दोनों मानों में शामिल नहीं होना चाहिए। सही होगा:

dbms_lob.compare (NVL (AUDIT_PAYLOAD_TEXT_DEC, Empty_Clob()), NVL (AUDIT_PAYLOAD_TEXT, Empty_Clob())) 
4

कैसे

के बारे में
select * from table_name where to_char(clob_column) ="test_string" 
+3

'TO_CHAR() 'केवल क्लॉब्स के लिए काम करता है जो 4000 वर्णों से कम लंबे होते हैं। – wweicker

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