zoukankan      html  css  js  c++  java
  • 正解SQLSEVER 2005 sql排序

    今天在论坛上看到一个问题,如下:

    解决这个问题,Insus.NET写了一个函数,可以方便以后的扩展,如果数值出现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,2NOT IN ('TB','GB','MB','KB'))
        
    RETURN NULL

    --去掉最后两位数之后,把值转为DECIMAL数据类型    
    SET @n = CONVERT(DECIMAL(18,6),LEFT(@OvLEN(@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])

    执行结果:

  • 相关阅读:
    安装go语言开发环境
    【Graph】399. Evaluate Division(Medium)
    【Divide and Conquer】53.Maximum Subarray(easy)
    int数组交并差集
    Git强制覆盖本地文件
    Git手动合并
    [转]关于BETA、RC、ALPHA、Release、GA等版本号的意义
    [置顶] java处理office文档与pdf文件(二)
    [置顶] 左联接数据不统一问题
    将博客搬至CSDN
  • 原文地址:https://www.cnblogs.com/insus/p/2147910.html
Copyright © 2011-2022 走看看