[英]How to sort data in stored procedure with column positions of select statement with CASE
这不行
ORDER BY
CASE
WHEN @OrderBy = 'EndDateInDays' AND @OrderByDirection = 'D'
THEN 10
END DESC,
CASE
WHEN @OrderBy = 'EndDateInDays' AND @OrderByDirection != 'D'
THEN 10
END
这个人在哪里工作
ORDER BY 10 DESC
根据文档,
ORDER BY order_by_expression
order_by_expression指定要对查询结果集进行排序的列或表达式 。 可以将排序列指定为名称或列别名,或者指定列在选择列表中的位置的非负整数。
来源: SELECT-ORDER BY子句(Transact-SQL)
您正在指定一个表达式,因此SQL Server不会按列#10中的值排序。 相反,它将按常量值“ 10”对行进行排序,这将导致不执行任何排序。
将所有复杂的列移动到CROSS APPLY子查询中,并使用排序列添加另一个CROSS APPLY:
SELECT F.Id
,cols.Favourite
,F.Agent
,F.Name
,cols.DatePublished
,UF.ToolTip
,F.CreationDate
FROM MyTable F
INNER JOIN MyTable2 UF
ON f.Id = UF.Id
CROSS APPLY (
SELECT (CASE WHEN UFF.[Id] IS NULL THEN CONVERT(BIT, 0) ELSE CONVERT(BIT, 1) END) AS Favourite
,CONVERT(Datetime, F.[Date] , 103) AS DatePublished
) cols
CROSS APPLY (
SELECT -- Make sure to correctly cast all numeric and date values to text
CASE WHEN @OrderBy = 'EndDateInDays' THEN CONVERT(VARCHAR(100), F.[EndDateDate], 126)
WHEN @OrderBy = 'Name' THEN F.Name
WHEN @OrderBy = 'DatePublished' THEN cols.DatePublished
ELSE CONVERT(VARCHAR(100), F.Id) -- This is default sort
END AS [SortCol]
) sort
ORDER BY
CASE WHEN @OrderByDirection = 'D' THEN sort.[SortCol] END DESC
,CASE WHEN @OrderByDirection != 'D' THEN sort.[SortCol] END
;
您可以使用列别名。 假设它是EndDateInDays
:
ORDER BY (CASE WHEN @OrderBy = 'EndDateInDays' AND @OrderByDirection = 'D'
THEN EndDateInDays
END) DESC,
(CASE WHEN @OrderBy = 'EndDateInDays' AND @OrderByDirection <> 'D'
THEN EndDateInDays
END)
如果EndDateInDays
是一个数字(如名称所示),则可以执行以下操作:
ORDER BY (CASE WHEN @OrderBy = 'EndDateInDays' AND @OrderByDirection = 'D'
THEN - EndDateInDays
WHEN @OrderBy = 'EndDateInDays' AND @OrderByDirection <> 'D'
THEN EndDateInDays
END)
另外,如果您开始合并多列,请小心。 最好为每个列使用单独的CASE
表达式,以防止意外的类型不匹配。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.