程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> 其他數據庫知識 >> 更多數據庫知識 >> 正解SQLSEVER 2005 sql排序(按大小排序)

正解SQLSEVER 2005 sql排序(按大小排序)

編輯:更多數據庫知識

今天在論壇上看到一個問題,如下:

 

解決這個問題,Insus.NET寫了一個函數,可以方便以後的擴展,如果數值出現TB或是或更高時,可以只改這個函數即可。
復制代碼 代碼如下:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[udf_OrderLimitSize]
(
@Ov NVARCHAR(30)
)
RETURNS decimal(18,6)
AS
BEGIN
--如果長度少於等於2的數值為返回NULL
IF (LEN(@Ov) <= 2)
RETURN NULL
--宣告兩個變量
DECLARE @v DECIMAL(18,6),@n DECIMAL(18,6)

--判斷最後兩位數是否為下面這些單位
IF (RIGHT(@Ov,2) NOT IN ('TB','GB','MB','KB'))
RETURN NULL
--去掉最後兩位數之後,把值轉為DECIMAL數據類型
SET @n = CONVERT(DECIMAL(18,6),LEFT(@Ov, LEN(@Ov) - 2))
--判斷截除最後兩位數之後,使用ISNUMERIC判斷是否為有效的數值,如果不是返回NULL
IF (ISNUMERIC(@n) = 0)
RETURN NULL
--下面做單位轉算,如果遇上有新單位時,可以作相應添加
IF (@Ov LIKE '%TB')
SET @v = @n * 1024 * 1024 * 1024
IF (@Ov LIKE '%GB')
SET @v = @n * 1024 * 1024
IF (@Ov LIKE '%MB')
SET @v = @n * 1024
IF (@Ov LIKE '%KB')
SET @v = @n
RETURN @v
END

下面為了應用這個函數,例舉例子:
復制代碼 代碼如下:
CREATE TABLE test(id int identity(1,1),size NVARCHAR(50))
GO
INSERT INTO [test] values('23.5mb'),('10gb'),('12.7mb'),('8GB')
go
SELECT [id],[size] FROM test ORDER BY [dbo].[udf_OrderLimitSize]([size])

執行結果:

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved