发布时间:2011-08-22 09:55 来源:未知
在SQL Server 2005的数据库操作中,遇到了这样的问题:数据字段是Varchar(50)类型,存的有GB,MB,KB,例如3.3GB,523.6MB,823KB,这种属性,两千多条,怎样对它按大小排序呢?SQL语句该如何写?
解决这个问题,我们可以用函数来实现,因为它可以方便以后的扩展,假如数值出现TB或是或更高时,可以只改这个函数即可。
udf_OrderLimitSize 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])
执行结果:
关于SQL Server 2005的SQL排序问题的解决方案就介绍这么多了,希望本次的介绍能够对您有所收获!