2010-08-16 17 views
5

मैं एक मेज जहां 3 स्तंभों में से एक किसी विशेष खोज स्ट्रिंग से मेल खाता से डेटा का चयन कर रहा हूँ मिला था पर निर्भर करता है:आदेश परिणाम प्रभावी जहां एक मैच

SELECT * 
FROM CARS 
WHERE MODEL LIKE searchString 
OR MANUFACTURER LIKE searchString 
OR DESCRIPTION LIKE searchString 

लेकिन मैं परिणाम के आधार पर ऑर्डर करने के लिए की जरूरत है जहां कॉलम वेटिंग के आधार पर मैच मिला था। अर्थात। यदि मैच मॉडल कॉलम में पाया गया था तो मैन्युअल निर्माता कॉलम में मिलान मिलने के बाद पंक्ति में परिणामों में उच्च दिखाई देना चाहिए। वज़न 1-मॉडल 2-निर्माता 3-वर्णन के साथ।

सभी मदद की सराहना की, धन्यवाद!

उत्तर

4

Oracle की पूर्ण पाठ खोज (FTS) functionaltiy - ओरेकल Text-- दोनों तेजी से हो सकता है और एक रैंक पर आधारित स्कोर एल्गोरिथ्म है प्रदान करेगा ...

SELECT c.*, 
      CASE 
       WHEN c.model LIKE searchstring THEN 1 
       WHEN c.manufacturer LIKE searchstring THEN 2 
       WHEN c.description LIKE searchstring THEN 3 
      END AS match_rank 
    FROM CARS c 
    WHERE c.model LIKE searchstring 
     OR c.manufacturer LIKE searchstring 
     OR c.description LIKE searchstring 
ORDER BY match_rank 

लेकिन आप कैसे संभाल करने का उल्लेख नहीं है यदि दो और अधिक स्तंभ मेल खाते हैं तो रैंकिंग ....

+0

रैंकिंग एक बार मैच में मिलने के बाद रोकना चाहिए। क्या यह प्रत्येक 'WHEN' कथन के अंत में 'अंत' जोड़ने के समान सरल है? – essembee

+0

बस एहसास हुआ कि एक बार एक शर्त सही होने के बाद, केस स्टेटमेंट परिणाम वापस कर देगा और शर्तों का मूल्यांकन नहीं करेगा। तो यह सही है, चीयर्स! – essembee

+0

अच्छा समाधान, लेकिन बड़ी टेबल पर प्रदर्शन की जांच करें .. अगर सबकुछ वापस कर रहा है तो उसे बहुत अधिक अंतर नहीं करना चाहिए, बस इस तरह की लागत। लेकिन यदि कोई टॉप (एक्स) सबसेट लौटाता है तो पूरी तालिका को पहले मैच द्वारा क्रमबद्ध करने की आवश्यकता होती है। निष्पादन योजना की जांच करें अपनी आवश्यकता के अनुरूप .. –

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