Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如果在ORDERBY子句中使用Case语句进行排序,则排序是不同的_Sql_Sql Server_Sql Server 2016 - Fatal编程技术网

Sql 如果在ORDERBY子句中使用Case语句进行排序,则排序是不同的

Sql 如果在ORDERBY子句中使用Case语句进行排序,则排序是不同的,sql,sql-server,sql-server-2016,Sql,Sql Server,Sql Server 2016,我正在执行两个不同的SQL查询,对我来说,它们应该产生相同的结果,但事实并非如此。排序顺序在第二个查询中更改。只是想知道为什么会这样 SELECT * FROM CTE ORDER BY ServiceDate ,ServiceTime ,CASE WHEN SortProfile = 'Y' THEN SortOrder1 ELSE SortOrder2 END ,CASE WH

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

SELECT * FROM CTE ORDER BY ServiceDate ,ServiceTime ,CASE WHEN SortProfile = 'Y' THEN SortOrder1 ELSE SortOrder2 END ,CASE WHEN SortProfile = 'N' THEN SortOrder2 ELSE SortOrder1 END ,Price DESC ------------------------------------------------------------------------------------ Code Date Time Price 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 SELECT * FROM CTE ORDER BY ServiceDate ,ServiceTime ,SortOrder2 ,Price DESC ------------------------------------------------------------------------------------ Code Date Time Price 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 试试这个:

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      

在第一种情况下,您不需要以下两种情况

WHEN SortProfile = 'Y'
        THEN SortOrder1
    ELSE SortOrder2
    END
,CASE 
    WHEN SortProfile = 'N'
        THEN SortOrder2
    ELSE SortOrder1
    END
使用它们中的任何一个,因为它们产生相同的结果

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

To me they should produce the same results, but its not
这两个结果都是正确的,因为最后3行在排序列中具有相同的值,因此这3行中的任何顺序都是可以接受的

您看到的差异是由这两个查询的不同执行计划解释的,它们是不同的,因为其中一个按顺序包含SortOrder1,而另一个不包含

当服务器阐述执行计划时,它不知道您的查询是否将返回或不返回Y行,因此它考虑SORTRODR1,并将其用于第一个计划的排序,而不在第二个计划中使用。


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

它产生相同的结果,但顺序不同。你是说它们应该产生相同的结果,但并非两者都是不同的东西,那么问题是……“排序”还是结果问题?你在CTE上的第二次查询的结果对我来说似乎是可疑的,部分原因是SortOrderTwo列的排序顺序毫无意义,这些数据是按数字排序,还是按文本排序。@Susang我的意思是排序issue@TimBiegeleisen对不起,我弄错了。我现在已经编辑了这个问题。请提供一些测试数据,假设是测试数据,我无法用给定的数据重新编写这个问题