Оператор IF в предложении ORDER BY оператора SELECT в хранимой процедуре SQL Server - PullRequest
6 голосов
/ 07 августа 2009

Я пытаюсь создать хранимую процедуру, которая принимает битовый параметр, который при истинных порядках одного столбца и ложных порядках другого столбца Как бы я это реализовал?

Вот что у меня есть

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

    END
GO

Ответы [ 7 ]

15 голосов
/ 07 августа 2009
ORDER BY
   CASE WHEN @switch = 0 THEN Field1 END,
   CASE WHEN @Switch = 1 THEN Field2 END
3 голосов
/ 07 августа 2009

Один из способов - создать запрос примерно так:

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
3 голосов
/ 07 августа 2009

грубый путь:

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 .. КОГДА я думаю:

SELECT
  acct_nbr,
  acct_name
FROM
  acct
ORDER BY
  CASE @switch
    WHEN 1 THEN acct_nbr
    WHEN 0 THEN acct_name
  END
2 голосов
/ 07 августа 2009

Я не совсем уверен, что вы можете? В итоге я бы сделал это:

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 голос
/ 07 августа 2009

Я думал, что вы можете изменить параметр на 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 Элемент SELECT, идентифицируемый ORDER BY номер 1 содержит переменную как часть выражения, идентифицирующего позиция столбца. Переменные только разрешено при заказе по выражению ссылка на имя столбца.

Найти в поиске это решение здесь (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 голосов
/ 07 августа 2009

Самый краткий подход:

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 может работать заметно лучше для больших наборов данных или может быть единственным подходящим подходом, если типы данных двух столбцов различаются

0 голосов
/ 07 августа 2009
    SELECT
            acct_nbr,
            acct_name
    FROM
            acct
    ORDER BY case @switch when 1 then acct_name else acct_nbr end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...