【问题标题】:Sorting is different if sorted using Case statement in Order By clause如果在 Order By 子句中使用 Case 语句进行排序,排序会有所不同
【发布时间】:2017-12-15 16:43:20
【问题描述】:

我正在执行 2 个不同的 SQL 查询,对我来说它们应该产生相同的结果,但事实并非如此。第二个查询中的排序顺序发生了变化。只是想知道为什么会这样?

选择 *
来自 CTE
按服务日期订购
    ,服务时间
    ,案子
        当 SortProfile = 'Y'
            然后排序顺序1
        ELSE 排序顺序2
        结尾
    ,案子
        当 SortProfile = 'N'
            然后排序顺序2
        ELSE 排序顺序 1
        结尾
    ,价格 DESC
-------------------------------------------------- ----------------------------------
代码 日期 时间 价格 SortProfile SortOrder2 SortOrder1
-------------------------------------------------- ----------------------------------
38424 02/10/2015 13:12:00 0 N 14 9
38440 02/10/2015 13:12:00 0 N 14 9
41892 02/10/2015 13:12:00 0 N 25 13
38436 02/10/2015 13:12:00 0 N 25 11
18228 02/10/2015 13:12:00 0 N 25 15


选择 *
来自 CTE
按服务日期订购
    ,服务时间
    ,排序顺序2
    ,价格 DESC

-------------------------------------------------- ----------------------------------
代码 日期 时间 价格 SortProfile SortOrder2 SortOrder1
-------------------------------------------------- ----------------------------------
38424 02/10/2015 13:12:00 0 N 14 9
38440 02/10/2015 13:12:00 0 N 14 9
18228 02/10/2015 13:12:00 0 N 25 15
38436 02/10/2015 13:12:00 0 N 25 11
41892 02/10/2015 13:12:00 0 N 25 13

【问题讨论】:

  • 它产生相同的结果,但顺序不同。你是说To me they should produce the same results, but its not 两者是不同的东西所以有什么问题.....'ordering` 或result 问题?
  • 您对 CTE 的第二次查询的结果对我来说似乎很可疑,部分原因是 SortOrderTwo 列的排序顺序没有意义,无论这些数据是按数字还是文本排序。
  • @Susang 我的意思是订购问题
  • @TimBiegeleisen 对不起,我的错。我现在已经编辑了问题
  • 请提供一些测试数据,我无法用给定数据重现问题(假设它是测试数据)

标签: sql sql-server sql-server-2016


【解决方案1】:
To me they should produce the same results, but its not

两个结果都是正确的,因为最后 3 行在排序列中具有相同值,因此这 3 行中的任何顺序都是可以接受的。

您看到的差异由 不同 execution plans 解释这两个查询(它们不同,因为其中一个在 order by 中包含 SortOrder1 而另一个不包含)。

当服务器详细说明execution plan 时,它不知道您的查询是否会返回带有“Y”的行,因此它会考虑SortOrder1 并将它用于第一个计划的排序中,而不是在第二个。

您可以通过查看这两个执行计划来证明这一点。

【讨论】:

    【解决方案2】:

    试试这个:

    select * from CTE
    order by SortProfile ,
    case when SortProfile  = 'Y' then SortOrderOne 
         else case when SortProfile = 'N' then SortOrdertwo 
              end
    end DESC,
    case when SortProfile  = 'Y' then SortOrdertwo
         else case when SortProfile = 'N' then SortOrderOne 
              end
    end DESC
    

    输出是:

    SortOrderOne    SortOrderTwo    SortProfile
    14              9               N         
    14              9               N         
    25              15              Y         
    25              13              Y         
    25              11              Y      
    

    【讨论】:

      【解决方案3】:

      在第 1 次排序中,您不需要以下 2 次按情况排序

      WHEN SortProfile = 'Y'
              THEN SortOrder1
          ELSE SortOrder2
          END
      ,CASE 
          WHEN SortProfile = 'N'
              THEN SortOrder2
          ELSE SortOrder1
          END
      

      使用其中任何一种,因为它们产生相同的结果。

      此外,这些列似乎根据 order by 条件正确排序,因为您 order by 中的所有列都已正确排序。只需按条件按顺序添加列 [code] 即可获得相同的结果。我认为这可能会解决问题

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-28
        • 1970-01-01
        • 1970-01-01
        • 2014-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多