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