数据库表中有一数量字段,是varchar型。记录的数据都是一些数量(带单位) 如25ml 50g等,单位有很多。
现在我想按某一条件得到数量的总和 怎么计算(同一单位的)。
这是我上次提的问题,我想再问问 如果有小数点怎么办,比如2.5g   50.25ml  0.9g等

解决方案 »

  1.   

    --提取数字
    IF OBJECT_ID('DBO.GET_NUMBER2') IS NOT NULL
    DROP FUNCTION DBO.GET_NUMBER2
    GO
    CREATE FUNCTION DBO.GET_NUMBER2(@S VARCHAR(100))
    RETURNS VARCHAR(100)
    AS
    BEGIN
    WHILE PATINDEX('%[^0-9]%',@S) > 0
    BEGIN
    set @s=stuff(@s,patindex('%[^0-9]%',@s),1,'')
    END
    RETURN @S
    END
    GO
    --测试
    PRINT DBO.GET_NUMBER('呵呵ABC123ABC')
    GO
    --123
    --------------------------------------------------------------------
      

  2.   

    数据=left(@S,PATINDEX('%[^0-9]%',@S)-1)
    单位=right(@S,len(@S)-PATINDEX('%[^0-9]%',@S))
      

  3.   

    这种设计,将使你无法进行数量的计算.因为其将设计到单位的换算,而每种单位的换算还不一样.
    1KG = 1000G
    1KM = 1000M
    1斤 = 10两
    1M  = 100CM
    ...
      

  4.   

    如果是数字的提取,则参考:create table tb(area varchar(20))
    insert into tb values('100平方米') 
    insert into tb values('120平方米') 
    insert into tb values('70-80平方米') 
    go--方法一
    [吖-咗]
    select left(area,PATINDEX('%[吖-做]%',area)-1) area from tb
    /*
    area                 
    -------------------- 
    100
    120
    70-80(所影响的行数为 3 行)
    */--方法二
    --建立如下函数(非a-z A-Z 0-9 - , 以及中文字符之外的字符删除)
    go
    create function getnewstr(@oldstr varchar(100)) returns varchar(100)
    as
      begin
        declare @i int
        set @i = 1
        while @i <= len(@oldstr)
        if substring(@oldstr, @i, 1) like('[^a-z,A-Z,0-9,-]')
           set @oldstr = replace(@oldstr, substring(@oldstr, @i, 1), '')
        else
           set @i = @i +1
        return @oldstr
    end
    goselect area = dbo.getnewstr(area) from tb where area like('%[^a-z,A-Z,0-9,-]%')
    /*
    area                 
    -------------------- 
    100
    120
    70-80(所影响的行数为 3 行)
    */drop table tb
    drop function dbo.getnewstr