2011-09-03 16 views
7

में एक सरणी कॉलम के भीतर एक स्ट्रिंग खोजें I PostgreSQL डेटाबेस में दृश्यों की एक श्रृंखला बनाई है जिसमें कुछ सरणी कॉलम शामिल हैं। दृश्य परिभाषा इस प्रकार है:PostgreSQL

create view articles_view as 
    (select articles.*, 
    array(select row(people.*)::people 
    from people 
    where articles.spubid=people.spubid and 
     people.stype='Author' and 
     bactive='t' 
    order by people.iorder) as authors, 
    array(select row(people.*)::people 
    from people 
    where articles.spubid=people.spubid and 
     people.stype='Editor' and 
     bactive='t' 
    order by people.iorder) as editors, 
    array(select row(people.*)::people 
    from people 
    where articles.spubid=people.spubid and 
     people.stype='Reviewer' and 
     bactive='t' 
    order by people.iorder) as reviewers, 
    array(select row(status.*)::status 
    from status 
    where articles.spubid=status.spubid and 
     bactive='t') as status 
    from articles 
    where articles.bactive='t'); 

अनिवार्य रूप से मुझे क्या करना चाहते हैं यह निर्धारित करने के लिए एक विशिष्ट प्रयोक्ता आईडी है कि सरणी में मौजूद रहने पर 'लेखक' कॉलम पर iLike है। जाहिर है, मैं उस डेटाटाइप पर iLike का उपयोग नहीं कर सकता, इसलिए मुझे एक और दृष्टिकोण खोजने की ज़रूरत है।

{ "(2373, टी, एफ, च, \" 2011-08-01 11:: 57:

यहाँ 'लेखकों' श्रेणी में डेटा का एक उदाहरण है ४०.६,९६,४९६ \ ", /Pubs/pubs_edit_article.php,\"2011-08-09 15: 36: २९.२,८१,८३३ \ ", 000,128,343, A00592, लेखक, 1, निकोलस, के, Kreidberg, \" \ ", 123456789, टी, व्यवस्थापक, एक , ए, ए, 0, \ "\") "," (2374, टी, एफ, एफ, \ "2011-08-01 11: 57: 40.706617 \",/पब्स/pubs_edit_article.php, \ "2011 -08-09 15: 36: 2 9 .8585428 \ ", 000128343, ए 005 9, लेखक, 2, जॉन, डी।, डो, \" \ ", 234567890, टी, आईटी, ए, ए, ए, 0, \" \ ")", "(2381, टी, एफ, च, \" 2011-08-09 14: 45: १४.८,७०,४१८ \ ", 000,128,343, \" 2011-08-09 15: 36: २९.२८,८५४ \ ", 000,128 343, A00592, लेखक, 3, जेन, ई, डो, \ "\", 345,678,901, टी, व्यवस्थापक, ए, ए, ए ,, \ "\") "," (2383, टी, एफ, च, \ "2011-08-09 15: 35: ११.८,४५,२८३ \", 567,890,123, \ "2011-08-09 15: 36: २९.२,९१,३८८ \", 000,128,343, A00592, लेखक, 4, टेस्ट, टी, Testerton, \ "\ ", TestTesterton, एफ, एन/ए, ए, ए, ए ,, \" \ ")"}

मुझे क्या करना सक्षम होना चाहते हैं एक प्रश्न दृश्य है और यह पता लगाने अगर स्ट्रिंग ' 123456789 '(वह सरणी में निकोलस क्रेडबर्ग को सौंपा गया उपयोगकर्ता आईडी है) सरणी में मौजूद है। मुझे कोई परवाह नहीं है कि यह किस उपयोगकर्ता को दिया गया है या जहां यह सरणी में दिखाई देता है, मुझे बस इतना पता होना चाहिए कि '123456789' सरणी में कहीं भी दिखाई देता है।

एक बार मुझे पता है कि एक प्रश्न है कि निर्धारित करता है लिखने के लिए अगर हालत ऊपर तो अपने आवेदन बस उस क्वेरी को निष्पादित करेंगे और अगर पंक्तियों लौटा दिया जाता है यह पता चल जाएगा कि प्रयोक्ता आईडी क्वेरी के लिए पारित किया है कि प्रकाशन के लिए एक लेखक है सच है और तदनुसार आगे बढ़ें।

इस विषय पर प्रदान की जा सकने वाली किसी अंतर्दृष्टि के लिए अग्रिम धन्यवाद।

+4

क्या कोई कारण है कि आप उचित डेटाबेस संरचना का उपयोग नहीं कर सकते हैं? अर्थात। लेखकों के लिए एक अलग तालिका और यदि यह एक एम: एन संबंध है लेखकों को एक टेबल मैपिंग लेख। – ThiefMaster

+3

@ थिफमास्टर Arrays पोस्टग्रेज़ द्वारा प्रदान किए जाते हैं और यह पूछने के लिए एक उचित सवाल है कि एक के भीतर कैसे खोज करें। –

+0

@ दाना, यह अभी भी एक विरोधी पैटर्न है (कोई सामान्यीकरण नहीं, कोई सूचकांक संभव नहीं है, जोड़ों में दर्द होता है, खोज दर्द होता है और वे धीमे होते हैं)। – Johan

उत्तर

17

इस सकता है:

select ... 
    from ... 
where ... 
     and array_to_string(authors, ', ') like '%123456789%';` 

चाल है?

अन्यथा, वहाँ unnest समारोह ...

"Array Functions and Operators" अध्याय में अधिक विवरण नहीं है।