ORDER BY,SELECT语句,重复代码

时间:2019-01-19 02:43:47

标签: sql-server tsql

我具有以下存储过程,并且取决于@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

2 个答案:

答案 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()将增加一个额外的列(行号),因此也许将它作为子查询将是一个更好的主意。但是,我只想给您更多选择,因为它可能会有所帮助。