SQL截取字符问题的答案

 

源:http://hi.baidu.com/wangzhiqing999/blog/item/8e405658fe97615ffaf2c05f.html

问题

表结构如下

表名是 jsptab 

列名是 na 规格列名是 gg

可口可乐500ml NULL
500ml可口可乐 NULL
旺仔QQ糖32g NULL
可比克35g薯片 NULL
晨奇中性笔GP-148 NULL
14BY文具盒 NULL
2.5kg白糖 NULL
晨奇148象皮擦'  

 

想要的结果是

列名是 na 规格列名是 gg

可口可乐500ml 500ml
500ml可口可乐 500ml
旺仔QQ糖32g 32g
可比克35g薯片 35g
晨奇中性笔GP-148 NULL
114BY文具盒 NULL
2.5kg白糖 2.5kg
晨奇148象皮擦 null

----

答案

 


-- 根据 单位的 位置,返回 数值信息
CREATE FUNCTION GetUnitNumber(@na VARCHAR(20), @finishIndex INT)
RETURNS VARCHAR(10)
AS
BEGIN
  -- 临时索引
  DECLARE @idx AS INT;
  -- 返回值.
  DECLARE @returnValue VARCHAR(10);
  -- 设置初始索引,准备向前查找
  SET @idx = @finishIndex - 1;
  WHILE @idx > 0
  BEGIN
    IF( ISNUMERIC (SUBSTRING(@na, @idx, @finishIndex - @idx) ) = 1 )
    BEGIN
      -- 当前信息为有效数据,
      -- 尝试再向前找一字符
      SET @idx = @idx - 1;
    END
    ELSE
    BEGIN
      -- 当前信息为无效数据,
      -- 需要退出循环
      SET @idx = @idx + 1;
      BREAK;
    END
  END
  -- 假如到 0了, 需要最后修正一下.
  IF @idx = 0
  BEGIN
    SET @idx = 1;
  END
  -- 返回.
  SET @returnValue = SUBSTRING(@na, @idx, @finishIndex - @idx);
  RETURN @returnValue;
END
GO


-- 根据 单位,返回 数字+单位信息
CREATE FUNCTION GetGGByUnit(@na VARCHAR(20),  @u VARCHAR(5))
RETURNS VARCHAR(10)
AS
BEGIN
  -- 单位的位置.
  DECLARE @idx  INT;
  DECLARE @idx2 INT;
  -- 返回值.
  DECLARE @returnValue VARCHAR(10);
  -- 初始化.
  SET @returnValue = NULL;
  -- 取得单位的位置.
  SET @idx = CHARINDEX(@u, @na)
  IF @idx + LEN(@u) - 1 = LEN(@na)
  BEGIN
    -- 这个 单位的 位置,是在名称的末尾
    -- 需要向前找数字.
    SET @returnValue = dbo.GetUnitNumber(@na, @idx) + @u;
  END
  ELSE
  BEGIN
    -- 这个 单位的 位置, 不是在名称的末尾, 可能是在开头, 可能在中间
    SET @idx2 = PATINDEX('%[0-9]%', @na);
    IF @idx2 > @idx
    BEGIN
      -- 单位 与  数字的 关系
      -- 是 先单位 后 数字的。是无效的数据.
      SET @returnValue = NULL;
    END
    ELSE
    BEGIN
      -- 数字 在 单位 前面.
      SET @returnValue = dbo.GetUnitNumber(@na, @idx) + @u;
    END
  END
  -- 返回.
  RETURN @returnValue;
END;
GO

 

-- 获取 规格内容
CREATE FUNCTION GetGG(@na  VARCHAR(20))
RETURNS VARCHAR(10)
AS
BEGIN
  -- 返回值.
  DECLARE @returnValue VARCHAR(10);
  -- 初始化.
  SET @returnValue = NULL;
  -- 这里根据需要,自行增加各种单位
  IF CHARINDEX('ML', @na) > 0
  BEGIN
    SET @returnValue = dbo.GetGGByUnit(@na, 'ML');
  END
  ELSE IF CHARINDEX('kg', @na) > 0
  BEGIN
    SET @returnValue = dbo.GetGGByUnit(@na, 'kg');
  END
  ELSE IF CHARINDEX('g', @na) > 0
  BEGIN
    SET @returnValue = dbo.GetGGByUnit(@na, 'g');
  END
  -- 返回.
  RETURN @returnValue;
END;
GO

 


CREATE TABLE #t
(
  na   VARCHAR(30),
  gg   VARCHAR(10)
);

INSERT INTO #t ( na )
  SELECT '可口可乐500ml'     UNION ALL
  SELECT '500ml可口可乐'     UNION ALL
  SELECT '旺仔QQ糖32g'       UNION ALL
  SELECT '可比克35g薯片'     UNION ALL
  SELECT '晨奇中性笔GP-148'  UNION ALL
  SELECT '114BY文具盒'       UNION ALL
  SELECT '2.5kg白糖'         UNION ALL
  SELECT '晨奇148象皮擦'         UNION ALL
  SELECT '统一100葱爆牛肉面59g(杯)'    UNION ALL
  SELECT '统一100芙蓉鲜虾面58g'
GO

 

 

SELECT
  na,
  dbo.GetGG(na) as gg
FROM
  #t
go


na                             gg
------------------------------ ----------
可口可乐500ml                      500ML
500ml可口可乐                      500ML
旺仔QQ糖32g                       32g
可比克35g薯片                       35g
晨奇中性笔GP-148                    NULL
114BY文具盒                       NULL
2.5kg白糖                        2.5kg
晨奇148象皮擦                       NULL
统一100葱爆牛肉面59g(杯)               59g
统一100芙蓉鲜虾面58g                  58g

(10 行受影响)


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值