SQL Server存储过程中SELECT语句的ORDER BY子句中的IF语句

时间:2009-08-07 11:22:28

标签: sql sql-server tsql

我正在尝试创建一个存储过程,该过程采用一个位参数,如果一个列为true,另一个列为false。我该如何实现?

这是我到目前为止所拥有的

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

    END
GO

7 个答案:

答案 0 :(得分:15)

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

答案 1 :(得分: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 :(得分: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

答案 3 :(得分: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

答案 4 :(得分: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):

  

Msg 1008,Level 16,State 1,Line 4   SELECT标识的SELECT项   ORDER BY number 1包含一个变量   作为表达识别的一部分   列位置。变量只是   通过表达式排序时允许   引用列名。

谷歌搜索找到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

答案 5 :(得分:0)

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

答案 6 :(得分: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语句中包装两个单独的查询可能对较大的数据集执行明显更好,或者如果两列的数据类型不同,则是唯一可行的方法。