2011-10-22 18 views
7

यहां वह स्थिति है जिसे मैं हल करने की कोशिश कर रहा हूं:क्लॉज द्वारा एसक्यूएल ऑर्डर में कस्टम सॉर्टिंग?

मेरे पास एक प्रश्न है जो रिकॉर्ड्स का एक सेट वापस कर सकता है। इस क्षेत्र के लिए क्रमबद्ध क्षेत्र में कई अलग-अलग मूल्य हो सकते हैं - इस सवाल के लिए हम कहेंगे कि मूल्य ए, बी, सी, डी, ई या जेड

अब क्वेरी के परिणामों के आधार पर हो सकता है सॉर्टिंग को निम्नानुसार व्यवहार करने की आवश्यकता है: यदि केवल एई रिकॉर्ड पाए जाते हैं तो उन्हें "स्वाभाविक रूप से" सॉर्ट करना ठीक है। लेकिन यदि परिणाम में एक जेड रिकॉर्ड है, तो इसे क्वेरी में पहला परिणाम होना चाहिए, लेकिन बाकी के रिकॉर्ड "प्राकृतिक" सॉर्ट ऑर्डर में होना चाहिए।

उदाहरण के लिए, यदि एसीडी पाए जाते हैं, तो परिणाम

A 
C 
D 

होना चाहिए लेकिन अगर ABDEZ तो पाए जाते हैं परिणाम सॉर्ट किया जाना चाहिए:

Z 
A 
B 
D 
E 

वर्तमान में, क्वेरी की तरह दिखता है:

SELECT NAME, SOME_OTHER_FIELDS FROM TABLE ORDER BY NAME 

मैं मैं मैं क्या चाहते करने के लिए एक प्रकार का समारोह कोड कर सकते हैं पता है, लेकिन क्योंकि कैसे की मैं उपयोग कर रहा हूँ नतीजे, मैं उपयोग नहीं कर सकता क्योंकि परिणाम किसी तीसरे पक्ष की लाइब्रेरी द्वारा संभाला जा रहा है, जिसके लिए मैं सिर्फ SQL क्वेरी पास कर रहा हूं। यह तब परिणामों को संसाधित कर रहा है, और मेरे परिणामों को हल करने के लिए कोई हुक नहीं लगता है और परिणाम केवल पुस्तकालय में पास करते हैं। इसे स्वयं SQL क्वेरी करने की आवश्यकता है, और मेरे पास लाइब्रेरी के स्रोत कोड तक कोई पहुंच नहीं है।

तो आप सभी के लिए एसक्यूएल गुरुओं के लिए, क्या आप मेरे लिए एक प्रश्न प्रदान कर सकते हैं जो मैं चाहता हूं?

+2

आप किस डेटाबेस का उपयोग कर रहे हैं? – evilone

+0

डीबी 2 बैकएंड है। मैं कुछ विरासत कोड के साथ काम कर रहा हूँ। अगर मैं एसक्यूएल को बदलने से बच सकता हूं जो सिस्टम मैं उपयोग कर रहा हूं। लेकिन कभी-कभी मुझे ऐसी चीज़ें मिलती हैं जिन्हें फिक्सिंग की आवश्यकता होती है। –

उत्तर

33

आप जेड रिकॉर्ड की पहचान कैसे करते हैं? यह क्या अलग करता है? एक बार जब आप इसे समझ लेंगे, तो इसे अपने ऑर्डर द्वारा क्लॉज में जोड़ें।

SELECT name, * 
FROM [table] 
WHERE (x) 
ORDER BY 
    (
    CASE 
     WHEN (record matches Z) THEN 0 
     ELSE 1 
    END 
    ), 
    name 

इस तरह, केवल जेड रिकॉर्ड पहले आदेश से मेल खाएगा, और अन्य सभी रिकॉर्ड दूसरे क्रम प्रकार (नाम) के अनुसार क्रमबद्ध किया जाएगा। यदि आपको वास्तव में इसकी आवश्यकता नहीं है तो आप दूसरे ऑर्डर सॉर्ट को बाहर कर सकते हैं।

उदाहरण के लिए, यदि जेड चरित्र स्ट्रिंग 'बॉब' है, तो आपकी क्वेरी हो सकता है:

SELECT name, * 
FROM [table] 
WHERE (x) 
ORDER BY 
    (
    CASE 
     WHEN name='Bob' THEN 0 
     ELSE 1 
    END 
    ), name 

मेरे उदाहरण, T-SQL के लिए कर रहे हैं के बाद से आप का उल्लेख नहीं किया है जो डेटाबेस का उपयोग कर रहे ।

SELECT 
NAME, 
SOME_OTHER_FIELDS, 
DECODE (NAME, 'Z', '_', NAME) SORTFIELD 
FROM TABLE 
ORDER BY DECODE (NAME, 'Z', '_', NAME) ASC 
+0

ऐसा लगता है कि यह उस दिशा में हो सकता है जिसे मैं जाना चाहता हूं। –

1

सुनिश्चित नहीं हैं कि डीबी आप का उपयोग जैसे कि उन ए..जेड मूल्यों की प्रकृति और आप किस डेटाबेस उत्पाद का उपयोग कर रहे हैं।

आप केवल एक ही मूल्य शीर्ष पर सॉर्ट करने के लिए है कि है, तो आप एक अभिव्यक्ति है कि (CASE या IIF या IFEQ साथ, अपने डेटाबेस के आधार पर) न्यूनतम संभव प्रकार मूल्य के लिए है कि मूल्य के नक्शे ORDER BY कर सकते हैं।

आप कई अलग अलग विशेष प्रकार मान है, तो आप ORDER BY सकता है एक और अधिक जटिल अभिव्यक्ति या आप कर सकते थे UNION एक साथ कई SELECT रों, डिफ़ॉल्ट प्रकार के लिए एक SELECT और प्रत्येक विशेष मूल्य के लिए एक अतिरिक्त SELECT साथ। SELECT एस में एक प्रकार का कॉलम शामिल होगा।

अंत में, यदि आपके पास कुछ मूल्य हैं तो आप अपनी क्वेरी में उस तालिका को अलग तालिका में डाल सकते हैं और JOIN उस तालिका में डाल सकते हैं।

1

इस समस्या को और सबसे अच्छा समाधान कारक है कि आप चर्चा नहीं करते की एक संख्या पर निर्भर करता है हल करने के तरीकों की एक संख्या हैं: Oracle के लिए निम्न कार्य -

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