2009-08-07 13 views
6

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

SELECT 
    acct_nbr, 
    acct_name 
FROM 
    acct 
ORDER BY 
    CASE @switch 
    WHEN 1 THEN acct_nbr 
    WHEN 0 THEN acct_name 
    END 

उत्तर

15
ORDER BY 
    CASE WHEN @switch = 0 THEN Field1 END, 
    CASE WHEN @Switch = 1 THEN Field2 END 
+1

यह केवल तब काम करता है जब फ़ील्ड 1 और फ़ील्ड 2 एक ही प्रकार के होते हैं। – edosoft

+1

आप इसे एक केस अभिव्यक्ति के रूप में लिख सकते हैं ... केस जब @ स्विच = 0 तब फ़ील्ड 1 जब @ स्विच = 1 फिर फ़ील्ड 2 अंत – pjp

+2

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

3

एक कच्चे रास्ते है मुझे सच में यकीन नहीं है कि आप कर सकते हैं? मैं यह कर रहा पहुंचते हैं:

CREATE PROCEDURE [dbo].[CLICK10_GetCP] 
    @switch AS BIT 
AS 
    BEGIN 
     if @switch 
     begin 
      SELECT 
        acct_nbr, 
        acct_name 
      FROM 
        acct 
      ORDER BY 
        acct_nbr 
     end 
     else 
     begin 
      SELECT 
        acct_nbr, 
        acct_name 
      FROM 
        acct 
      ORDER BY 
        acct_name 
     end 
    END 
GO 
2

:

IF @switch = 1 
    BEGIN 
    SELECT 
      acct_nbr, 
      acct_name 
    FROM 
      acct 
    ORDER BY acct_nbr 
    END 
ELSE 
    BEGIN 
    SELECT 
      acct_nbr, 
      acct_name 
    FROM 
      acct 
    ORDER BY acct_name 
    END 

तुम भी CASE..WHEN उपयोग करने के लिए मुझे लगता है कि सक्षम होना चाहिए:

यहाँ मैं अब तक

CREATE PROCEDURE [dbo].[CLICK10_GetCP] 
    @switch AS BIT 
AS 
    BEGIN 
     SELECT 
      acct_nbr, 
      acct_name 
     FROM 
      acct 
     ORDER BY 

    END 
GO 
+1

आप आदेश द्वारा में एक मामला बयान का उपयोग करके यह कर सकते हैं, लेकिन अगर क्वेरी sufficently जटिल है, अपने विधि तेजी से हो जाएगा। –

0
SELECT 
      acct_nbr, 
      acct_name 
    FROM 
      acct 
    ORDER BY case @switch when 1 then acct_name else acct_nbr end 
+0

यह केवल तभी काम करता है जब acct_nbr और acct_name में एक ही डेटाटाइप होता है, या एक दूसरे के लिए परिवर्तनीय होते हैं। – edosoft

+0

सच है, लेकिन यह एक उपयोगी तकनीक है। –

1

मैंने सोचा कि आप किसी पूर्णांक पर पैरामीटर को बदल सकता है, और प्रकार है कि क्रमसूचक साथ कॉलम के आधार पर:

CREATE PROCEDURE [dbo].[CLICK10_GetCP] 
    @ordinal AS INT 
AS 
    BEGIN 
     SELECT 
       acct_nbr, 
       acct_name 
     FROM 
       acct 
     ORDER BY @Ordinal 

    END 
GO 

यह एक अच्छा त्रुटि फेंकता (SQL2005):

संदेश 1008, स्तर 16, राज्य 1, पंक्ति 4 का चयन करें आइटम नंबर 1 द्वारा आदेश द्वारा की पहचान कॉलम स्थिति की पहचान करने वाली अभिव्यक्ति के हिस्से के रूप में एक चर है। वेरिएबल्स केवल को अभिव्यक्ति द्वारा ऑर्डर करते समय कॉलम नाम का संदर्भ देते हैं।

Googling के आसपास पाया this solution here (SQL 2005 और ऊपर):

CREATE PROCEDURE [dbo].[CLICK10_GetCP] 
    @switch AS BIT 
AS 
    BEGIN 
     SELECT 
       acct_nbr, 
       acct_name 
     FROM 
       acct 
     ORDER BY CASE 
      WHEN @switch = 0 THEN (RANK() OVER (ORDER BY acct_nbr, acct_name)) 
      WHEN @switch = 1 THEN (RANK() OVER (ORDER BY acct_name, acct_nbr)) 
     END 
GO 
0

सबसे संक्षिप्त दृष्टिकोण है:

CREATE PROCEDURE [dbo].[CLICK10_GetCP] 
    @switch AS BIT 
AS 
    BEGIN 
     SELECT 
       acct_nbr, 
       acct_name 
     FROM 
       acct 
     ORDER BY 
       case @switch 
        when 1 then acct_nbr 
        when 0 then acct_name 
       end 

    END 
GO 

यह बड़ा के लिए एक गरीब कार्य योजना लागू में हो सकता है टेबल, या यह बिल्कुल काम नहीं कर सकता है अगर acc-nbr एक int और acct-name एक वर्चर है।

आईएफ/ईएलएसई कथन में दो अलग-अलग प्रश्नों को लपेटना बड़े डेटासेट के लिए काफी बेहतर प्रदर्शन कर सकता है या दो स्तंभों के डेटा प्रकार अलग होने पर एकमात्र व्यावहारिक दृष्टिकोण हो सकता है।

3

एक तरह से इस तरह क्वेरी कुछ का निर्माण करने के लिए है:

CREATE PROCEDURE [dbo].[CLICK10_GetCP] 
    @switch AS BIT 
AS 
DECLARE 
@SQL nvarchar(max) 


    SET @SQL N'SELECT 
      acct_nbr, 
      acct_name 
    FROM 
      acct 
    ORDER BY ' 

if(@switch) 
BEGIN 
    @SQL = @SQL + ' acct_nbr ' 
END 
ELSE 
BEGIN 
    @SQL = @SQL + ' acct_Name ' 
END 

Exec SP_ExecuteSQL @SQL 
संबंधित मुद्दे