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 行受影響)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章