簡體   English   中英

Sql 服務器 - 如何排序非字母數字

[英]Sql Server - How to sort other than alphanumeric

在 Sql Server 2008 中,我有一個 DB 表,數據包含一個字段,該字段以如下形式指示時間段:2d、1w、4y,其中“d”= 日,“w”= 周,“y”= 年。 基於此字段排序的最佳方法是什么,以便它們按時間順序排列(例如“3w”在“1y”之前)?

謝謝

我想你很幸運 d 在 w 之前並且 w 也在 y 之前所以你可以這樣做

ORDER BY RIGHT(MyField, 1), CONVERT(int, LEFT(Field, LEN(Field) - 1))

但是,例如,這不會將 1w 放在 8d 之前。

所以一個替代(更復雜)的解決方案可能是

ORDER BY 
   CASE RIGHT(Field, 1)
       WHEN 'd' THEN LEFT(Field, LEN(Field) - 1)
       WHEN 'w' THEN 7*LEFT(Field, LEN(Field) - 1)
       ELSE 356 * LEFT(Field, LEN(Field) - 1)
   END 

它對您的數據做出假設(例如,只有 d、w 和 y 將在那里)並且不考慮閏年(如果這很重要)。

隨着時間的推移,您可能會有不同的時期。 所以我會把這些時間段放在一個帶有 ID、時間段和排序順序(或天數)的新表中。 在初始表中將字段替換為 time_period_id 並在您的查詢中進行連接並在 SORT BY 中使用它。

用字符串數字替換您的字符並在排序之前轉換為 integer ,例如:

convert(int, replace(replace(replace(myField,'d',''),'w','0')'y','00'))

所以你的 3d 是 3,2w 是 20,4y 是 400。


想了想,還是通過case表達式來計算實際值會更好。 例如,2w 得到 14,小於 13d。

我的方法是編寫一個 function 來解析您的持續時間字符串並以可以表示的最小可能單位對其進行規范化(我假設它是天,但如果您可以用小時或更小的單位表示,請使用它)。 然后,有一個計算列,它是針對您的列調用的 function 的值。 在這一點上,這只是比較數字的問題。 當然,魔鬼在細節中……雖然我不喜歡嘗試從 T-SQL 解析文本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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