免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3415 | 回复: 2
打印 上一主题 下一主题

求自定义TRIM函数 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-10-20 17:45 |只看该作者 |倒序浏览
各位大侠,

请问怎么写一个DB2的自定义的TRIM函数?

这个函数要能去掉输入字符的前导及拖尾字符,前导及拖尾字符包括从NULL (\u0000) 到SPACE (\u0020) 间的所有字符.

这些字符可能为:
TAB
SPACE
打印控制符
换行符

总之,只要范围在NULL (\u0000) 到SPACE (\u0020)之间的,都需要TRIM掉.

急,请兄弟们支持.

论坛徽章:
0
2 [报告]
发表于 2010-10-21 09:25 |只看该作者
db2自己的带的不能满足?那只能自己用c写了。

论坛徽章:
0
3 [报告]
发表于 2010-10-22 11:25 |只看该作者
我自己搞了一个纯SQL版的,不过我更想要C版.

CREATE  FUNCTION TrimChar (
v_instr    VARCHAR(4000)
)
RETURNS VARCHAR(4000)
LANGUAGE SQL
------------------------------------------------------------------------
-- FUNCTION: SUPERTRIM
-- Description:
--
------------------------------------------------------------------------

BEGIN ATOMIC
DECLARE v_len    INTEGER;        -- Length of string
DECLARE v_lcode  INTEGER;        -- Ascii code of the left char
DECLARE v_rcode  INTEGER;        -- Ascii code of the right char
DECLARE v_lflag  INTEGER;        -- End flag for left hand
DECLARE v_rflag  INTEGER;        -- End flag for right hand
DECLARE v_outstr VARCHAR(4000);  -- Output string

IF v_instr is NULL THEN
  RETURN NULL;
END IF;

SET v_outstr = v_instr;
SET v_len    = Length(v_outstr);
SET v_lflag  = 0;
SET v_rflag  = 0;

WHILE v_lflag*v_rflag = 0 DO
  
  SET v_lcode = Ascii(Left(v_outstr,1));
  SET v_rcode = Ascii(Right(v_outstr,1));
  
  IF (v_lcode between 0 and 32) THEN
    SET v_outstr = Right(v_outstr,v_len-1);
        SET v_len    = Length(v_outstr);
  ELSE
    SET v_lflag = 1;
  END IF;
  
  IF (v_rcode between 0 and 32) THEN
    SET v_outstr = Left(v_outstr,v_len-1);
        SET v_len    = Length(v_outstr);
  ELSE
    SET v_rflag = 1;
  END IF;

END WHILE;

RETURN v_outstr;
END
;
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP