2009-08-07 149 views

回答

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

這隻適用於Field1和Field2屬於同一類型。 – edosoft 2009-08-07 11:41:34

+1

你可以把它寫成一個case表達式...... CASE WHEN @ switch = 0 THEN Field1 WHEN @ switch = 1 THEN Field2 END – pjp 2009-08-07 11:47:27

+2

如果每個CASE都有一個THEN子句,則不必擔心該字段的類型是。 – 2009-08-07 11:56:59

3

原始方法:

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我想:

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

我不確定你可以嗎?我最終會做這樣的:

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 
+1

您可以通過在ORDER BY用CASE語句做到這一點,但如果查詢是配備充分複雜,你的方法會更快。 – 2009-08-07 11:28:06

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 2009-08-07 11:30:21

+0

是的,但它是一種有用的技術。 – 2009-08-07 11:59:34

1

我想你可以在參數更改爲int,並排序與序數列:

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行 由 ORDER BY鑑定號1的SELECT項目包含變量 作爲識別 列表位置的表達式的一部分。當通過引用列名稱的表達式 進行排序時,變量僅允許使用 。

周圍的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是一個varchar,它可能根本不起作用。

在IF/ELSE語句中包裝兩個單獨的查詢可能對較大的數據集執行明顯更好的操作,或者如果兩列的數據類型不同,則它們是唯一可行的方法。

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