Sql 如果在ORDERBY子句中使用Case语句进行排序,则排序是不同的
我正在执行两个不同的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 试试这个: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
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对不起,我弄错了。我现在已经编辑了这个问题。请提供一些测试数据,假设是测试数据,我无法用给定的数据重新编写这个问题