【问题标题】:Sending a parameter to a stored procedure and using IF ELSE to order by field-asc-desc将参数发送到存储过程并使用 IF ELSE 按 field-asc-desc 排序
【发布时间】:2014-02-09 17:34:58
【问题描述】:

我正在熟悉存储过程在 MSSQL 2012 上的工作方式。

我有一个名为 Users 的表:

Users
------
UserId
FirstName
LastName
CardNumber

我想要一个存储过程,在其中我给它指定要排序的字段,以及它是 asc 还是 desc 顺序。

SELECT * FROM dbo.Users
if @filtername == "FirstName" && @filterorder == "DESC"
  ORDER BY FirstName DESC
else 
  ORDER BY FirstName ASC

如何在我的 SQL 查询中创建简单的 IF ELSE 条件?

【问题讨论】:

    标签: sql sql-server tsql sql-order-by


    【解决方案1】:

    我知道这并不能真正解决您的问题,但最好的方法是使用表示层来执行此操作。无论是在应用程序(see link)还是报告服务等。

    但如果您必须从存储过程中执行此操作,您可以使用动态 sql(我希望尽可能避免这种情况)或...

    IF @filtername == "FirstName" && @filterorder == "DESC"
      SELECT UserId, FirstName, LastName, CardNumber
      FROM dbo.Users
      ORDER BY FirstName DESC
    ELSE IF @filtername == "FirstName" && @filterorder == "ASC"
      SELECT UserId, FirstName, LastName, CardNumber
      FROM dbo.Users
      ORDER BY FirstName ASC
    

    如果数据收集部分比较复杂,那么尝试使用临时表来收集数据,然后执行上述操作...

    如果您可以省略其中的 filterorder 部分...您实际上可以这样做...

    declare @filtername varchar(100) = 'FirstName'
    
    select <columnlist> from dbo.Users
    order by case when @filtername = 'FirstName' then FirstName end DESC
    

    因此,使用底部方法确定要过滤的列...然后使用顶部方法(if/else)确定 ASC/DESC。希望对您有所帮助。

    【讨论】:

    • 根据我的经验,您的第二个解决方案(案例构造)的性能远远低于可接受的水平,执行计划可能会变得非常糟糕。坚持第一个建议....
    • @Paul,我完全同意你的看法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-05
    相关资源
    最近更新 更多