2011-03-07 10 views
5

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

समस्या है, मुझे ऑर्डरबी के लिए एक केस का उपयोग करने की आवश्यकता है, और ऐसा लगता है कि कोड केस कॉलम में पहले 'प्रकार' को स्वीकार करता है ... कोई अन्य प्रकार असफल हो जाता है।

मेरे कोड इस तरह है:

WITH error_table AS 
( 
    SELECT Row_Number() OVER 
    (ORDER BY 
     CASE @orderBy 
      WHEN 1 THEN received_date -- Last Rx'd message 
      WHEN 2 THEN message_id -- Message Id 
      WHEN 3 THEN zibmat.short_name -- Message action type 
      WHEN 4 THEN error_action.short_name -- Status type 
      WHEN 5 THEN ime.[allocated_date] -- Allocated Date 
      ELSE received_date 
    END) AS RowNumber 

    ,ime.[ijis_message_error_id] 
     ,ime.[message_id] 
     ,ime.[message_version] 

तो, जब OrderBy 1 है, यह काम करता है। यह rx_date द्वारा टाइप करता है ... लेकिन जब मैंने इसे 2 भेजा, तो यह डेटा समय रूपांतरण त्रुटि के साथ विफल रहता है।

ऐसा लगता है कि सभी प्रकार की तरह ही होना चाहिए ...

भेजा जा रहा है एक 5 ठीक काम करता है, के रूप में है कि एक दिनांक समय भी है।

क्या कोई तरीका है जिससे मैं इसे ठीक कर सकता हूं?

+0

"वहाँ एक रास्ता है मैं इसे ठीक कर सकता हूं? "- हाँ: उन्हें सभी समान डेटाटाइप बनाएं –

+0

@ रिचर्ड उर्फ ​​साइबरकीवी: मुझे इसके बारे में पता है मैंने विशेष रूप से कुछ भी निर्दिष्ट नहीं किया: संभावित रूप से उचित पैडिंग शामिल होगी। मैंने पहले इस तरह से हल किया है जिस तरह से आपने उत्तर दिया है ... –

उत्तर

7

एक केस स्टेटमेंट केवल एक डेटा प्रकार को हल करना होगा। यह इस तथ्य के बावजूद है कि आप जानते हैं कि @orderby केवल एक शाखा का चयन करेगा और यह एक विशेष डेटा प्रकार होगा।

आप इस तरह कुछ उपयोग कर सकते हैं, जो गुंजाइश होगा लेकिन काम करेगा।

ORDER BY 
CASE @orderBy WHEN 1 THEN received_date -- Last Rx'd message 
WHEN 2 THEN 0 
WHEN 3 THEN 0 
WHEN 4 THEN 0 
WHEN 5 THEN ime.[allocated_date] -- Allocated Date 
ELSE received_date END, 
CASE @orderBy WHEN 1 THEN 0 
WHEN 2 THEN message_id -- Message Id 
WHEN 3 THEN 0 
WHEN 4 THEN 0 
WHEN 5 THEN 0 
ELSE 0 END, 
CASE @orderBy WHEN 1 THEN '' 
WHEN 2 THEN '' 
WHEN 3 THEN zibmat.short_name -- Message action type 
WHEN 4 THEN error_action.short_name -- Status type 
WHEN 5 THEN '' 
ELSE '' END 
+0

+1: दूसरा विकल्प गतिशील ऑर्डर द्वारा क्लॉज के लिए गतिशील एसक्यूएल है। –

+0

+1। इस तरह मैंने इसे पहले कार्यान्वित किया है। –

+0

यह वास्तव में अच्छा काम करता है, धन्यवाद। बस मैं समझता हूं कि, यह क्या कर रहा है, अगर हमारे पास 1 चयनित (दिनांक समय का प्रकार) है, तो यह अनुपस्थित है, recieved_date, 0, 0, 0, सही है? जहां हम 3 में पारित होते हैं, तो यह 0, 0, zibmat.short_name, 0 द्वारा ऑर्डर करेगा? – Craig

4

यह भी काम करता प्रतीत होता है।

ORDER BY 
     CASE @orderBy 
      WHEN 1 THEN CAST(received_date AS SQL_VARIANT) -- Last Rx'd message 
      WHEN 2 THEN message_id -- Message Id 
      WHEN 3 THEN zibmat.short_name -- Message action type 
      WHEN 4 THEN error_action.short_name -- Status type 
      WHEN 5 THEN ime.[allocated_date] -- Allocated Date 
      ELSE received_date 
    END 

टेस्ट मामले (int, string, date)

DECLARE @P INT = Datepart(SECOND, Getdate())%3; 

SELECT 'Sorting By ' + CASE @P 
      WHEN 1 THEN 'modify_date' 
      WHEN 2 THEN 'object_id' 
      ELSE 'name' 
      END 

SELECT object_id, 
     name, 
     modify_date 
FROM sys.objects 
ORDER BY CASE @P 
      WHEN 1 THEN CAST(modify_date AS SQL_VARIANT) 
      WHEN 2 THEN object_id 
      ELSE name 
      END 
1

मैं एक निम्न अधिक होगा क्लीनर विकल्प (RichardTheKiwi के दृष्टिकोण के समान) लगता है

WITH error_table AS 
( 
    SELECT ROW_NUMBER() OVER 
      (
      ORDER BY 
       CASE WHEN @orderBy = 1 THEN received_date END, 
       CASE WHEN @orderBy = 2 THEN message_id END , 
       CASE WHEN @orderBy = 3 THEN zibmat.short_name END, 
       CASE WHEN @orderBy =4 THEN error_action.short_name END, 
       CASE WHEN @orderBy =5 THEN ime.[allocated_date] END 
      ) AS RowNumber 

    ,ime.[ijis_message_error_id] 
    ,ime.[message_id] 
    --..other columns... 
    -- FROM YOURTABLE 
) 
+0

अपना कोड – NoNaMe

+0

प्रारूपित करें इसे स्वीकार किया जाना चाहिए ... –

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