2011-01-25 20 views
19

क्या लौटाए गए परिणामों के लिए सॉर्ट ऑर्डर को परिभाषित करना संभव है?टीएसक्यूएल - क्या सॉर्ट ऑर्डर को परिभाषित करना संभव है?

मैं सॉर्ट ऑर्डर 'नारंगी' 'सेब' 'स्ट्रॉबेरी' नहीं चढ़ना या अवरोही करना चाहता हूं।

मुझे पता है कि ऑर्डर एएससी या डीईएससी कर सकता है लेकिन क्या एक निश्चित ('नारंगी', 'सेब', 'स्ट्रॉबेरी') चीज चीज है? एक और के साथ

ORDER BY CASE your_col 
      WHEN 'orange' THEN 1 
      WHEN 'apple' THEN 2 
      WHEN 'strawberry' THEN 3 
     END 

वैकल्पिक वाक्य रचना,:

यह एसक्यूएल सर्वर पर चल रहे हो जाएगा 2000

उत्तर

44

यह अविश्वसनीय रूप से भद्दा है, लेकिन आप उपयोग कर सकते हैं ऑर्डर करने के लिए एक केस स्टेटमेंट:

SELECT * FROM Blah 
ORDER BY CASE MyColumn 
    WHEN 'orange' THEN 1 
    WHEN 'apple' THEN 2 
    WHEN 'strawberry' THEN 3 
    END 

वैकल्पिक रूप से, आप एक द्वितीयक तालिका बना सकते हैं जिसमें सॉर्ट फ़ील्ड और सॉर्ट ऑर्डर शामिल हो।

TargetValue SortOrder 
orange  1 
apple  2 
strawberry 3 

और इस तालिका में अपनी तालिका में शामिल हों।

+14

हां! जैसे कि मैं लिटिल बॉबीटेबल्स नामक किसी भी एसक्यूएल पर आने वाले किसी भी एसक्यूएल पर भरोसा करने जा रहा हूं :-) – paxdiablo

+2

@pax - <यहां एडमिरल अकबर की तस्वीर डालें> :-) – LittleBobbyTables

+0

तालिका विकल्प के लिए +1, हमेशा अधिक लचीला – RichardTheKiwi

9

एक CASE statement का प्रयोग करें

ORDER BY CASE 
      WHEN your_col = 'orange' THEN 1 
      WHEN your_col = 'apple' THEN 2 
      WHEN your_col = 'strawberry' THEN 3 
      ELSE 4 
     END 
+0

क्या होगा यदि मैं चयन परिणामों के अंत में कुछ आइटम दिखाना चाहता हूं? – user1451111

2

मुझे लगता है कि इस मामले में क्या कर

ORDER BY 
    CASE WHEN FRUIT = 'Orange' THEN 'A' 
     WHEN FRUIT = 'Apple' THEN 'B' 
     WHEN FRUIT = 'Strawberry' THEN 'C' 
     ELSE FRUIT 
END 
+0

क्या होगा यदि मैं कुछ आइटमों को चयन परिणामों के अंत में दिखाना चाहता हूं? – user1451111

5

यह एक अल्पकालिक आवश्यकता हो एक मामले बयान का उपयोग करने के लिए जा रहा है, तो है। हालांकि, अगर आपको लगता है कि यह थोड़ी देर के लिए हो सकता है, और यह हमेशा orange/apple/strawberry ऑर्डर (या यहां तक ​​कि यदि नहीं - नीचे देखें) होने जा रहा है, तो आप कुछ गति प्राप्त करने के लिए कुछ डिस्क स्थान बलिदान के बारे में सोचना चाह सकते हैं।

or_ap_st नामक अपनी तालिका में एक नया कॉलम बनाएं और अपने फल कॉलम के मूल्य के आधार पर नंबर 1, 2 या 3 के साथ इसे पॉप्युलेट करने के लिए एक सम्मिलित/अपडेट ट्रिगर का उपयोग करें। फिर उस पर सूचकांक।

चूंकि पंक्ति में परिवर्तन होने पर एक ही समय में उस कॉलम में डेटा बदल जाएगा, यह करने का सबसे अच्छा समय है। लागत को बड़ी संख्या में पढ़ने के बजाए लिखने की एक छोटी संख्या पर खर्च किया जाएगा, इसलिए select बयानों पर अमूर्त किया गया।

आपकी क्वेरी फिर एक blindingly उपवास होगा:

select field1, field2 from table1 
order by or_ap_st; 
प्रदर्शन की हत्या कोई प्रति-पंक्ति कार्यों के साथ

और, यदि आप अन्य प्रकार के ऑर्डर भी चाहते हैं, तो यही कारण है कि मैंने कॉलम or_ap_st कहा। आपको जितनी जरूरत हो उतनी अन्य सॉर्टिंग कॉलम जोड़ सकते हैं।

1

turtlepick's answer से आगे जा रहे हैं:

ORDER BY 
    CASE WHEN FRUIT = 'Orange' THEN 'A' 
     WHEN FRUIT = 'Apple' THEN 'B' 
     WHEN FRUIT = 'Strawberry' THEN 'C' 
     ELSE FRUIT 
    END 

मामले में आप फल में कुछ और आइटम नहीं हैं और वे फिर कीवर्ड, उन वस्तुओं हार्डकोडेड आदेश के भीतर प्रकट होता के बाद परिभाषित पत्र के साथ शुरू करने के लिए होता है। उदाहरण के लिए केले स्ट्रॉबेरी से पहले दिखाई देता है।आप आशा व्यक्त की कि वे फल में मूल्यों की शुरुआत में दिखाई नहीं होता में कम ASCII मूल्यों के साथ

ORDER BY 
    CASE 
    WHEN FRUIT = 'Orange' THEN '.1' 
    WHEN FRUIT = 'Apple' THEN '.2' 
    WHEN FRUIT = 'Strawberry' THEN '.3' 
    ELSE FRUIT 
    END 

यहाँ मैं का इस्तेमाल किया है पात्रों के साथ यह दरकिनार कर सकते हैं।

0

मेज पर एक कुंजी जोड़ें (जैसे fruit_id पूर्णांक पहचान (1,1) प्राथमिक कुंजी) डालने

create table fruit(fruit_id int identity(1,1) primary key, name varchar(50)) 
go 

insert into fruit(name) values ('orange') 
insert into fruit(name) values ('apple') 
insert into fruit(name) values ('strawberry') 

select name from fruit 

परिणाम के आदेश को बचाने के लिये:

orange 
apple 
strawberry 
0

के रूप में आम नहीं है, लेकिन एकल मूल्य संचालन या विशिष्ट पैटर्न के लिए, REPLACE भी काम करता है

उदाहरण के लिए।

DECLARE @Fruit TABLE (Fruit_Id INT IDENTITY(1, 1) PRIMARY KEY ,Name VARCHAR(50)); 

INSERT INTO @Fruit (Name) VALUES ('Orange'); 
INSERT INTO @Fruit (Name) VALUES ('Apple'); 
INSERT INTO @Fruit (Name) VALUES ('Strawberry'); 
INSERT INTO @Fruit (Name) VALUES ('__Pear'); 


SELECT * FROM @Fruit AS f 
ORDER BY REPLACE(f.Name,'__','') 



Fruit_Id Name 
----------- -------------------------------------------------- 
2   Apple 
1   Orange 
4   __Pear 
3   Strawberry 
संबंधित मुद्दे