【问题标题】:SQL Server Dynamic Order BySQL Server 动态排序依据
【发布时间】:2009-04-15 13:16:19
【问题描述】:

我正在尝试在存储过程中使用动态顺序,因此我可以将希望数据返回到存储过程中的顺序作为参数传递。这适用于 VARCHAR 字段,但是如果我尝试对 int 或 datetime 字段进行排序,则会出错,我的代码如下

DECLARE @ORDERBY INT
SET @ORDERBY = 1
SELECT TOP 10 * FROM TBL_LMS_USERS_RECORDs_LAST_ATTEMPT
ORDER BY 
CASE 
    WHEN @OrderBy = 1 THEN s10_record_dow
    --WHEN @OrderBy = 2 THEN pk_big_record_id
    else s10_record_dow
END

如果我取消注释 case 语句中的第二个 WHEN,则会出错

“将数据类型 varchar 转换为 bigint 时出错。”

如果我不使用 case 语句,我可以按此字段排序。

有什么想法吗?

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    改成这样:

    SELECT TOP 10 * FROM TBL_LMS_USERS_RECORDs_LAST_ATTEMPT
    ORDER BY 
        CASE WHEN @OrderBy = 1 THEN s10_record_dow ELSE NUll END,  
        CASE WHEN @OrderBy = 2 THEN pk_big_record_id ELSE NULL END,
        CASE WHEN @OrderBy <> 1 AND  @OrderBy <> 2 THEN s10_record_dow 
             ELSE NULL 
        END
    

    【讨论】:

    • 谢谢,这似乎有效,出于兴趣,为什么它可以正常工作,我如何使用 VARCHAR 但为了使用 INT 或其他数据类型,我必须以这种方式使用它?
    • Case 中的所有字段都需要评估为相同的数据类型。但是,如果列表中的所有字段都可以转换为单个数据类型,那么您应该能够使用单个 Case 语句。 . 如果您将数据列转换为 Case 内的该数据类型
    【解决方案2】:

    为什么不使用 ROW_NUMBER()?

    SELECT TOP 10 
           *,
           CASE @SortBy
             WHEN 'A' THEN ROW_NUMBER () OVER (ORDER BY s10_record_dow)
             WHEN 'B' THEN ROW_NUMBER () OVER (ORDER BY pk_id)
           END RowNumber
    FROM TBL_LMS_USERS_RECORDs_LAST_ATTEMPT
    

    那么您排序的列可以是任何类型。

    【讨论】:

      【解决方案3】:
      order by 
      (case when (@orderByAsc = 1) then r.SomeColumn end) asc,
      (case when (@orderByAsc = 0) then r.SomeColumn end) desc
      

      这就是你上升或下降的方式

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-14
        • 1970-01-01
        相关资源
        最近更新 更多