我具有以下存储过程,并且取决于@AreaNumber参数,它将运行完全相同的查询,但具有不同的order by子句。
有没有一种方法可以合并两个查询,而不是使用IF语句?
ALTER PROCEDURE [dbo].[spAlerts]
@AreaNumber tinyint = NULL
IF @AreaNumber is NULL
SELECT *
FROM alerts
ORDER BY DateModified DESC, DateCreated DESC
ELSE
SELECT *
FROM alerts
ORDER BY IsPermanent ASC, DateModified DESC, DateCreated DESC
答案 0 :(得分:3)
ORDER BY
可以是一个任意表达式,因此您可以在查询本身内部移动IF
(但可以作为CASE
表达式):
select * from alerts
ORDER BY (CASE WHEN @AreaNumber IS NULL THEN '-' ELSE IsPermanent END) ASC,
DateModified DESC,
DateCreated DESC
我没有方便的SQL Server实例来测试怪癖,但是'-'本质上是一个虚拟的备用对象。它将对所有行具有相同的值,因此不会影响排序
答案 1 :(得分:1)
好吧,您可以在CASE
子句中使用ORDER BY
或使用ROW_NUMBER()来完成此操作。
SELECT *
FROM alerts
ORDER BY
CASE WHEN @AreaNumber IS NOT NULL THEN IsPermanent ELSE '' END
, DateModified DESC
, DateCreated DESC
OR
SELECT *
, CASE WHEN @AreaNumber IS NOT NULL
THEN ROW_NUMBER() OVER(ORDER BY IsPermanent ASC, DateModified DESC, DateCreated DESC)
ELSE ROW_NUMBER() OVER(ORDER BY DateModified DESC, DateCreated DESC)
END RN
FROM alerts
使用ROW_NUMBER()
将增加一个额外的列(行号),因此也许将它作为子查询将是一个更好的主意。但是,我只想给您更多选择,因为它可能会有所帮助。