当前位置: 首页 > 面试题库 >

我可以将SQL Server排序顺序存储在变量中吗?

墨宜人
2023-03-14
问题内容

我在存储过程中有以下SQL。有没有一种方法可以删除IF语句,并将’ASC’/’DESC’选项作为变量传递?

我知道我可以用多种不同的方式进行查询,或者返回一个表并在外部对其进行排序等。我只想知道是否可以避免重复CASE语句。

IF @sortOrder = 'Desc'
  BEGIN
    SELECT * FROM #t_results
    ORDER BY
    CASE WHEN @OrderBy = 'surname'           THEN surname END DESC,
    CASE WHEN @OrderBy = 'forename'          THEN forename END DESC,
    CASE WHEN @OrderBy = 'fullName'          THEN fullName END DESC,
    CASE WHEN @OrderBy = 'userId'            THEN userId END DESC,
    CASE WHEN @OrderBy = 'MobileNumber'      THEN MSISDN END DESC,
    CASE WHEN @OrderBy = 'DeviceStatus'      THEN DeviceStatus END DESC,
    CASE WHEN @OrderBy = 'LastPosition'      THEN LastPosition END DESC,
    CASE WHEN @OrderBy = 'LastAlert'         THEN LastAlert END DESC,
    CASE WHEN @OrderBy = 'LastCommunication' THEN LastCommunication END DESC,
    CASE WHEN @OrderBy = 'LastPreAlert'      THEN LastPreAlert END DESC 
    END
 ELSE
   BEGIN
    SELECT * FROM #t_results
    ORDER BY
    CASE WHEN @OrderBy = 'surname'           THEN surname END DESC,
    CASE WHEN @OrderBy = 'forename'          THEN forename END DESC,
    CASE WHEN @OrderBy = 'fullName'          THEN fullName END DESC,
    CASE WHEN @OrderBy = 'userId'            THEN userId END DESC,
    CASE WHEN @OrderBy = 'MobileNumber'      THEN MSISDN END DESC,
    CASE WHEN @OrderBy = 'DeviceStatus'      THEN DeviceStatus END DESC,
    CASE WHEN @OrderBy = 'LastPosition'      THEN LastPosition END DESC,
    CASE WHEN @OrderBy = 'LastAlert'         THEN LastAlert END DESC,
    CASE WHEN @OrderBy = 'LastCommunication' THEN LastCommunication END DESC,
    CASE WHEN @OrderBy = 'LastPreAlert'      THEN LastPreAlert END DESC 
    END
END

问题答案:

传入@OrderBy int,其中正数是ASC,负数是DESC,实际数字是要排序的列

SELECT
    dt.yourColumn1
        ,dt.yourColumn2
        ,dt.yourColumn3
        ,CASE 
            WHEN @OrderBy>0 THEN dt.SortBy
            ELSE NULL
         END AS SortByAsc
        ,CASE 
            WHEN @OrderBy<0 THEN dt.SortBy
            ELSE NULL
         END AS SortByDesc
    FROM (SELECT
              yourColumn1
                  ,yourColumn2
                  ,yourColumn3
                  ,CASE
                      WHEN ABS(@OrderBy) = 1 THEN surname
                      WHEN ABS(@OrderBy) = 2 THEN forename
                      WHEN ABS(@OrderBy) = 3 THEN fullName
                      WHEN ABS(@OrderBy) = 4 THEN CONVERT(varchar(10),userId)
                      WHEN ABS(@OrderBy) = 5 THEN CONVERT(varchar(10),MobileNumber
                      WHEN ABS(@OrderBy) = 6 THEN DeviceStatus
                      WHEN ABS(@OrderBy) = 7 THEN LastPosition
                      WHEN ABS(@OrderBy) = 8 THEN CONVERT(varchar(23),LastAlert,121)
                      WHEN ABS(@OrderBy) = 9 THEN CONVERT(varchar(23),LastCommunication,121)
                      WHEN ABS(@OrderBy) =10 THEN CONVERT(varchar(23),LastPreAlert,121)
                      ELSE NULL
                  END AS SortBy
              FROM YourTablesHere
              WHERE X=Y
         ) dt
    ORDER BY SortByAsc ASC, SortByDesc DESC

只需确保您构建的字符串能够正确排序,请注意,我使用’YYYY-MM-DD
hh:mm:ss.mmm’作为日期,并将数字放入字符串中。我们通常将多个列放在一起,因此,如果您按姓氏排序,也使用姓氏,等等。请注意,如果您合并多个列,则需要用零或空格填充。

如果您不希望将SortByAsc和SortByDesc列包含在结果集中,请将整个内容包装在派生表中。



 类似资料:
  • 问题内容: 我只是想知道我是否可以做类似的事情: 通过执行以下操作: 我写的内容行不通,但是有类似的功能吗? 问题答案: 是的,但是您不会像这样写切片。您写。

  • 我想在Firebase数据库上从上到下排序。有人能帮帮我吗?我试图使用集合,但不起作用。 启动回收者视图的活动 MyClass用户

  • 问题内容: 我正在尝试通过sequelize从数据库中输出所有对象列表,如下所示,并希望在我在where子句中添加id时对数据进行整理。 但是问题是渲染后,所有数据按如下进行整理。 正如我发现的那样,它既没有按ID也没有按名称排序。请帮我解决。 问题答案: 在序列化中,您可以轻松添加order by子句。 看看我如何添加对象数组? 编辑: 一旦在诺言中收到对象,您可能必须订购这些对象。查看有关根据

  • The order in which request variables are registered, similar to variables_order in php.ini 请求变量的顺序在这里配置,类似于php.ini中的变量顺序.

  • 问题内容: 我有点在等待这个问题的答案。 我很想知道是否可以在if子句中检查变量的同时保存变量。 假设我有这段代码。 我现在独立处理“失败”状态,即使结果相同。我可以像这样将它们聚在一起: 已经有很多更整洁的代码。如果foo为null,它将在那里停止并且不会尝试foo.getBar(在if中),因此我不会获得NPE。我要增强的最后一件事是主要问题:我真的给两次foo.getBar()打电话吗?如果

  • 主要内容:顺序表的初始化顺序表,全名 顺序存储结构,是 线性表的一种。通过《 什么是线性表》一节的学习我们知道,线性表用于存储逻辑关系为“一对一”的数据,顺序表自然也不例外。 不仅如此,顺序表对数据的物理存储结构也有要求。 顺序表存储数据时,会提前申请一整块足够大小的物理空间,然后将数据依次存储起来,存储时做到数据元素之间不留一丝缝隙。 例如,使用顺序表存储集合  ,数据最终的存储状态如图 1 所示: 图 1 顺序存储结