2012-09-24 20 views
6

में प्रासंगिकता के आधार पर परिणाम खोजना और प्रदर्शित करना मैं ओरेकल डेटाबेस क्वेरी विकास के लिए बहुत शुरुआत कर रहा हूं। मैं ज़िप या नाम या शहर पर स्टोर खोजने के लिए अपनी प्रोजेक्ट के लिए एक खोज कार्यक्षमता विकसित कर रहा हूं, जहां उपयोगकर्ता को खोज शब्द दर्ज करने के लिए "एक HTML इनपुट बॉक्स" प्रदान किया जाएगा। वहाँ केवल तालिका नामक स्टोरओरेकल

परिणामों को प्रदर्शित करने के लिए स्थितियां हैं

  1. है खोज करने के लिए ZIP परिणाम का मिलान नहीं हुआ अवधि GROUP और SORT BY ZIP DESC
  2. होना चाहिए, तो अगर खोज करने के लिए NAME परिणाम का मिलान नहीं हुआ अवधि समूह होना चाहिए और NAME IN ASC और CITY
  3. के अनुसार क्रमबद्ध करें यदि खोज शब्द ZIP से मेल खाता है, NAME और CITY (सभी), तो पहले ZIP करने के लिए मिलान परिणाम DESC order में, प्रदर्शित किया जाना चाहिए अगले CITYNAME

के बाद मैं इस

SELECT s.uuid AS uuid, COUNT(*) over() AS rowcount 
FROM Stores s 
WHERE s.postalcode LIKE '%87%' 
     OR s.city LIKE '%87%' 
     OR CONCAT(CONCAT(s.firstname, ' '),s.lastname) LIKE '%87%'    
GROUP BY s.city, s.postalcode, 
     CONCAT(CONCAT(s.firstname, ' '),s.lastname), s.uuid 
ORDER BY CASE WHEN s.postalcode LIKE '%87%' 
       THEN s.postalcode END DESC, 
     CASE WHEN CONCAT(CONCAT(s.firstname, ' '),s.lastname) LIKE '%87%' 
       THEN CONCAT(CONCAT(s.firstname, ' '),s.lastname) 
       ELSE s.postalcode END ASC, 
     CASE WHEN s.city LIKE '%87%' 
       THEN s.city END 

जैसे कुछ बात की कोशिश की है इस क्वेरी नहीं है अपेक्षित परिणामों को प्रदर्शित करना (मेरा मतलब है कि यह आदेश के बिना परिणाम प्रदर्शित कर रहा है, पहले ज़िप की तरह नहीं, अगले शहर के नाम के बाद)।

उपर्युक्त आवश्यकताओं को पूरा करने के लिए मैं क्वेरी कैसे कर सकता हूं, क्या मुझे ऐसा करने के लिए संग्रहीत प्रक्रियाओं का उपयोग करने की आवश्यकता है? किसी सुझाव के लिए बहुत आभारी होंगे।

+1

यह होमवर्क जैसा लगता है, इसे इस तरह चिह्नित करें। यह आज भी पूछे गए इस प्रश्न के समान चौंकाने वाला है: http://stackoverflow.com/questions/12564918/why-oracle-is-saying-not-a-group-by-expression – Harrison

+0

क्या आपने 'केस' डालने का प्रयास किया है 'चयन' और 'समूह BY' खंडों में 'ORDER BY' खंड में निर्माण करें? इसे ठीक उसी तरह डालने का प्रयास करें और क्या हम परिणाम देख सकते हैं। – Rachcha

उत्तर

1

मेरा उत्तर आपकी स्कीमा के लिए नहीं हो सकता है लेकिन मुझे पता है कि इससे मदद मिल सकती है।

मेरे पास एक टेबल address है जिसमें कॉलम addressid, address1, address2, address3, city, zip, province, countryid, regionid, modified, modifiedby, VERSION, created, createdby हैं।

मेरी आवश्यकता प्रासंगिकता, केस असंवेदनशील द्वारा खोजना है। प्रासंगिकता के लिए सर्वोच्च प्राथमिकता पर कॉलम CITY पर दिया गया है। फिर यह ADDRESS3, ADDRESS2 और ADDRESS1 है।

मेरे पास :searchKey है जो एक बाध्य चर के रूप में है जो उपयोगकर्ता द्वारा इनपुट किया जाना है (मैं ओरेकल डेटाबेस पर एसक्यूएल डेवलपर का उपयोग कर रहा हूं)। मैं सफलतापूर्वक उपयोग किया गया है निम्नलिखित:

SELECT addressid, address1, address2, address3, city, zip 
     , province, regionid, countryid 
    FROM address 
    WHERE UPPER(address1||' '||address2||' '||address3||' '||city) 
     LIKE '%' || UPPER(:searchKey) || '%' -- << Makes search case insensitive 
ORDER BY CASE 
       WHEN UPPER(city) = UPPER(:searchKey)    THEN 10 
       WHEN UPPER(city) LIKE UPPER(:searchKey) || '%'  THEN 9 
       WHEN UPPER(city) LIKE '%'|| UPPER(:searchKey) ||'%' THEN 8 
       ELSE 0 
      END DESC -- << Highest priority given to cities that match the best 
     , CASE WHEN UPPER(address3) LIKE UPPER(:searchKey) ||'%'  THEN 5 
       WHEN UPPER(address3) LIKE '%'|| UPPER(:searchKey) ||'%' THEN 4 
       ELSE 0 
      END DESC 
     , CASE WHEN UPPER(address2) LIKE UPPER(:searchKey) ||'%'  THEN 3 
       WHEN UPPER(address2) LIKE '%'|| UPPER(:searchKey) ||'%' THEN 2 
       ELSE 0 
      END DESC 
     , CASE WHEN UPPER(address1) LIKE UPPER(:searchKey) ||'%'  THEN 2 
       WHEN UPPER(address1) LIKE '%'|| UPPER(:searchKey) ||'%' THEN 1 
       ELSE 0 
      END DESC 
; 

आप अपनी प्राथमिकताएं अनुसार प्रासंगिकता अनुमति देने के लिए CASE निर्माण में मूल्यों को बदल सकते हैं।