首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> SQL Server 2005

SQL Server 正確排序含單位的容量字串 (KB、MB、GB、TB)

     編輯:SQL Server 2005

問題

字串欄位儲存 '23.5MB', '10GB', '12.7MB', '8GB',直接 ORDER BY Size 會按字元序排序 (10GB 排在 23.5MB 前),不符合實際大小。

解決:純量函數轉換為位元組數值

CREATE FUNCTION dbo.udf_OrderLimitSize(@val NVARCHAR(30))
RETURNS DECIMAL(18,6)
AS BEGIN
    IF LEN(@val) <= 2 RETURN NULL;
    DECLARE @num DECIMAL(18,6), @bytes DECIMAL(18,6);
    IF RIGHT(@val,2) NOT IN ('TB','GB','MB','KB') RETURN NULL;
    SET @num = CONVERT(DECIMAL(18,6), LEFT(@val, LEN(@val)-2));
    IF ISNUMERIC(@num) = 0 RETURN NULL;

    IF @val LIKE '%TB' SET @bytes = @num * 1024 * 1024 * 1024;
    ELSE IF @val LIKE '%GB' SET @bytes = @num * 1024 * 1024;
    ELSE IF @val LIKE '%MB' SET @bytes = @num * 1024;
    ELSE IF @val LIKE '%KB' SET @bytes = @num;

    RETURN @bytes;
END
GO

使用範例

CREATE TABLE #t (Id INT IDENTITY, Size NVARCHAR(50));
INSERT #t VALUES ('23.5MB'),('10GB'),('12.7MB'),('8GB');
SELECT Id, Size FROM #t ORDER BY dbo.udf_OrderLimitSize(Size);
-- 結果: 12.7MB, 23.5MB, 8GB, 10GB

擴充性

未來新增 PB、EB 單位,只需在函數內增加對應 IF 區塊,呼叫端 SQL 無需修改。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved