在SQL Server 2008中的Order by子句中连接内部大小写中的条件



我在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
  • 订单int(它是一个相关的数字(

我要做的事情:如果@OrderByDescription=1,我想获得一个部门列表及其描述顺序。否则,如果@OrderByDescription=0,我想获得按顺序排序的列表字段(末尾会放null(。

所以假设下面的例子。

案例1:Department表中的某些部门不在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错误。

您得到了o。订单有点错位-它需要在初始case语句结束后:

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

最新更新