簡體   English   中英

如何使用CASE在select語句的列位置對存儲過程中的數據進行排序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM