我在一个应用程序中遇到了一段旧代码。ORDER BY在这里不起作用。从执行计划来看,ORDER BY似乎根本没有执行。
IF(1 = 1)
(
SELECT * FROM dbo.Table WHERE Column1= 'abc'
)
ELSE
(
SELECT * FROM dbo.Table
)
ORDER BY Column2
我知道我可以通过像这样重构这个查询来让它工作。但是我很好奇为什么ORDER BY在上面的查询中没有被执行。
IF(1 = 1)
BEGIN
SELECT * FROM dbo.Table WHERE Column1= 'abc' ORDER BY Column2
END
ELSE
BEGIN
SELECT * FROM dbo.Table ORDER BY Column2
END
ORDER BY
工作,但仅适用于ELSE
子句。SQL Server允许以下语法:
(SELECT * FROM dbo.Table )
ORDER BY Column2
这就是代码被解释的方式。ORDER BY
是ELSE
的一部分。并且我应该指出IF
条件为真,因此正在执行的是THEN
查询。
你可以用UNION ALL
代替IF
:
SELECT * FROM dbo.Table WHERE 1 = 1 AND Column1= 'abc'
UNION ALL
SELECT * FROM dbo.Table WHERE NOT (1 = 1)
ORDER BY Column2
(这里没有,但是IF条件空值可能需要处理。)