在SQL Server 2008的Order by子句中以大写字母并置条件

时间:2018-07-27 10:01:37

标签: sql-server sql-server-2008

我在SQL Server 2008中有一个查询,并且尝试通过以下方式对其进行排序:

        SELECT  d.DeptId, Description
        FROM    Dept d LEFT JOIN DeptOrder o on p.DeptId = o.DeptId
        WHERE   d.DeptId IN (3, 7, 9, 10, 17, 20)
        ORDER BY
           CASE WHEN @OrderByDescription = 1 THEN Description
                                             ELSE CASE WHEN o.Order IS NULL THEN 1                                                     ELSE 0 
                                                  END, o.Order
           END

表格

部门:包含具有以下列的部门列表:

  • DeptId int
  • 说明varchar(50)

DeptOrder:列出公司部门的订单,并具有以下列:

  • DeptId int
  • Order int(它是一个相关数字)

我正在尝试做的事情: 如果@OrderByDescription = 1,我想按描述获取按描述顺序排列的部门列表。否则,如果@OrderByDescription = 0,我想获取按订单字段排序的列表(空值将放在最后)。

所以假设下面的例子。

情况1:“部门”表中的某些部门不在DeptOrder表中,并且@OrderByDescription = 0

Department
DeptId     Description
  1        Financial
  2        Marketing
  3        Communications
  4        I+D
 ... 
  7        Accounting

以此类推

假设DeptOrder表仅包含以下部门(此表可能不包含某些部门。此处未列出的部门将放在列表的末尾):

DeptOrder 
DeptId     Order
  7        1
  3        2

获得的列表将是:

DeptId说明    7会计学    3通讯
然后其余订单按o.Order。

案例2 : Deptartment表中的部门不在DeptOrder表中,并且@OrderByDescription = 1

Department
DeptId     Description
  1        Financial
  2        Marketing
  4        Communications
  5        I+D
  8        Accounting

结果将是(按描述排序):

Department
DeptId     Description
  8        Accounting
  4        Communications
  1        Financial
  5        I+D
  2        Marketing      

但是,在第二种情况的结尾处连接“,o.Order”时,出现了sql错误。

1 个答案:

答案 0 :(得分:0)

您有o.Order稍微错位了-它需要在初始case语句关闭之后:

ORDER BY
   CASE WHEN OrderByDescription = 1 
        THEN [Description]
        ELSE CASE WHEN o.[Order] IS NULL 
                  THEN '1'
                  ELSE '0'
              END
    END
    ,o.[Order]