2009-08-07 14 views

Odpowiedz

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

Działa to tylko wtedy, gdy Field1 i Field2 są tego samego typu. – edosoft

+1

Możesz napisać to jako jedno wyrażenie przypadku ... PRZYPOMNIENIE, JEŚLI @ przełącznik = 0 THEN Pole1 KIEDY @ przełącznik = 1 THEN Pole2 END – pjp

+2

Jeśli każdy CASE ma jedną klauzulę THEN, nie musisz się martwić, jaki typ pól są. –

3

surowy sposób:

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 

Należy również mieć możliwość korzystania z CASE..WHEN myślę:

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

Naprawdę nie jestem pewien, czy możesz? Chciałbym skończyć w ten sposób:

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

Można to zrobić za pomocą instrukcji CASE w ORDER BY, ale jeśli zapytanie jest sufficently złożone, metoda będzie szybciej. –

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

Działa to tylko wtedy, gdy acct_nbr i acct_name mają ten sam typ danych lub są ze sobą konwertowalne. – edosoft

+0

To prawda, ale jest to przydatna technika. –

1

Myślałem można zmienić parametr do int i sortować według kolumny z tym porządkowa:

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

    END 
GO 

To generuje piękny błąd (SQL2005):

Msg 1008, Level 16, State 1, Linia 4 SELECT poz zidentyfikowane przez ORDER bY numerem 1 zawiera zmienną jako część wyrażenia identyfikującą pozycję kolumny. Zmienne to tylko dozwolone przy składaniu przez wyrażenie odwołujące się do nazwy kolumny.

googling około znaleźć this solution here (SQL 2005 i więcej):

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

najbardziej zwięzłe podejście jest:

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 

To może skutkować złym planu wykonania dla większych tabele, lub może nie działać w ogóle, jeśli acc-nbr jest int i acct-name jest varchar.

Zawijanie dwóch oddzielnych zapytań w instrukcjach IF/ELSE może działać znacznie lepiej w przypadku większych zestawów danych lub stanowić jedyną wykonalną metodę, jeśli typy danych w obu kolumnach są różne.

3

Jednym ze sposobów jest budować coś Query takiego:

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 
Powiązane problemy