现有字段Note,内容格式为数字+单位,如100.00mg,1.00ml等等,现想从中截取出数字和单位,分别赋值给A和B两个字段。

解决方案 »

  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
    --------------------------------------------------------------------
    --提取英文
    IF OBJECT_ID('DBO.GET_STR') IS NOT NULL
    DROP FUNCTION DBO.GET_STR
    GO
    CREATE FUNCTION DBO.GET_STR(@S VARCHAR(100))
    RETURNS VARCHAR(100)
    AS
    BEGIN
    WHILE PATINDEX('%[^a-z]%',@S) > 0
    BEGIN
    set @s=stuff(@s,patindex('%[^a-z]%',@s),1,'')
    END
    RETURN @S
    END
    GO
    --测试
    PRINT DBO.GET_STR('呵呵ABC123ABC')
    GO
    --------------------------------------------------------------------
    --提取中文
    IF OBJECT_ID('DBO.CHINA_STR') IS NOT NULL
    DROP FUNCTION DBO.CHINA_STR
    GO
    CREATE FUNCTION DBO.CHINA_STR(@S NVARCHAR(100))
    RETURNS VARCHAR(100)
    AS
    BEGIN
    WHILE PATINDEX('%[^吖-座]%',@S) > 0
    SET @S = STUFF(@S,PATINDEX('%[^吖-座]%',@S),1,N'')
    RETURN @S
    END
    GO
    PRINT DBO.CHINA_STR('呵呵ABC123ABC')
    GO
      

  2.   

    DECLARE @STR VARCHAR(50),@NUM NUMERIC(19,6),@UNIT VARCHAR(50)
    SELECT @STR='100.00mg'
    SELECT @NUM=LEFT(@STR,CASE PATINDEX('%[^0-9.]%',@STR) WHEN 0 THEN LEN(@STR) ELSE PATINDEX('%[^0-9.]%',@STR) END-1)
    ,@UNIT=STUFF(@STR,1,CASE WHEN PATINDEX('%[^0-9.]%',@STR)>0 THEN PATINDEX('%[^0-9.]%',@STR)-1 ELSE 0 END,'')
    SELECT @NUM,@UNIT
    --100.000000 mg