通用固定长度编码格式字符串查找算法实现.docVIP

通用固定长度编码格式字符串查找算法实现.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
? ? ?? 通用固定长度编码格式的字符串查找算法的实现 ? ? 字符串的查找是数据库应用中必不可少的操作,而且每种数据库产品(ORACLE、DB2、SYBASE、MS SQL SERVER、MYSQL等等)也都提供了对应的字符串处理函数,比如DB2的LOCATE函数。 但在实际的工作中,还是会遇到一些特殊情况的处理,这使得直接使用字符串查找函数,得到的结果可能是错误的,比如本文中提到的固定长度编码格式的字符串的查找。值得注意的是,本文提出的算法可以稍加修改即移植到其它关系数据库系统或者前端开发工具中。 在实际数据库应用系统中,会经常遇到有些数据表中的一些字段,实际上是采用了某些固定格式的编码规则,比如在本人工作单位中的OLTP数据库中,有一个出口流水表TB_OUTLISTGW中的ROADCOMB字段、ROADSSTARTSTATION字段、ROADSSTARTSTATION字段中都是经过固定长度编码格式的数据,ROADCOMB记录了在广东省高速公路上行驶的车辆所经过的所有高速公路的组合,采用16进制编码,每两位表示一条高速公路的16进制编码,比如11代表10进制的17,即广惠高速公路。 举个例子来说,要统计哪些流水是经过了广惠高速公路(实际上需求比这复杂得多)。大家都会给出以下的SQL 语句(DB2格式) SELECT * FROM DEVELOP.TB_OUTLISTGW WHERE LOCATE(ROADCOMB,’11’)0 FETCH FIRST 100 ROW ONLY WITH UR; 但实际上,这条语句是有一定问题的,ROADCOMB是每两位的16进制数据代表了一条路段,查找的时候需要每两个字符跟目标路段匹配一次,而不是每个字符+后面的字符跟目标字符串逐次进行匹配,本人采取的是以下的做法,建立了一个固定长度编码格式的字符串匹配通用函数,大家可以用其它关系数据库系统的SQL语法格式来翻译过去,这样就可以在其它数据库系统使用了。以下是笔者用万能数据库查询分析器的中文版本《DB 查询分析器》来创建并调用 这个通用的固定长度编码格式的字符串查找函数的过程。(具体方法详见我的博文《DB 查询分析器 6.03 方便地创建DB2自定义函数》) DROP FUNCTION DEVELOP.F_LOCATE_FIXED $$ ---通用的固定长度编码格式的字符串查找函数 CREATE FUNCTION DEVELOP.F_LOCATE_FIXED(IN V_SRC VARCHAR(4096),IN V_DES VARCHAR(4096)) RETURNS INTEGER LANGUAGE SQL DETERMINISTIC NO EXTERNAL ACTION CONTAINS SQL BEGIN ATOMIC DECLARE v_result INTEGER DEFAULT 0; DECLARE str_road VARCHAR(4096); DECLARE v_len_src INTEGER; DECLARE v_len_des INTEGER; DECLARE v_pos_src INTEGER DEFAULT 1; SET v_len_des=LENGTH(TRIM(V_DES)); SET v_len_src=LENGTH(TRIM(V_SRC)); SET v_result=0; AUTHLOOP: WHILE v_pos_src+v_len_src=v_len_des DO SET str_road=SUBSTR(V_DES,v_pos_src,v_len_src); IF ( str_road=V_SRC ) THEN SET v_result=v_pos_src; --函数返回匹配的实际物理位置 SET v_result=v_result/v_len_src+1; --函数返回匹配的逻辑位置,即第几个子串位置;这一条语句如果注释掉,函数将返回匹配的实际物理位置 LEAVE AUTHLOOP; ELSE SET v_pos_src=v_pos_src+v_len_src; END IF; END WHILE; RETURN v_result; END $$ values DEVELOP.F_LOCATE_FIXED(11,4F0A0B0D231154533F01) $$ values DEVELOP.F_LOCATE_FIXED(11,01100110011001100110011001100110) $$ SELECT * FROM DEVELOP.TB_OUTLIS

文档评论(0)

kehan123 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档