最近项目需要从号码里头找出一些特定格式的吉祥号码.
笔记一下. 本来函数是返回Boolean的,发现不能用在where 的条件,所以按照鬼佬的提示,改成返回 'Y','N'. where 条件是 where fliter_gsm_number('130000000','aaaa') ='Y'
在Oracle10g on AIX 测试通过
入参:
号码,吉祥号码格式,如 'AAA', '8AAA' ,'ABAB','AABB' ,'ABCD'
目前支持
- 连号 如 00000,11111.
- A数字A数字
- A数字..A
- 步步高升系列 ABCDE,EDCBA
欢迎补充 >.<
CREATE OR REPLACE FUNCTION fliter_gsm_number(gsm_number in varchar2,exp in varchar2) return varchar2 is
regexp varchar2(200);
i number;
icount number;
slen number;
elen number;
alpha varchar2(100);
pgsm_number varchar2(100);
begin
--号码格式长度不能超过号码长度
if length(exp) > length(gsm_number) then
return 'N';
end if;
pgsm_number := gsm_number;
--判断号码格式
--连号 至少2位匹配 AA 或 BB
if regexp_like(exp,'^([[:digit:]]*)([[:alpha:]])\2+([[:digit:]]*)') then
alpha := regexp_substr(exp,'([[:alpha:]])\1+');
slen := instr(exp,alpha);
elen := slen + length(alpha)-1 ;
if slen> 1 then
regexp := substr(exp,1,slen-1);
end if;
regexp := regexp||'([[:digit:]])\1{'|| to_char(elen-slen) ||'}'; --'([[:digit:]])(\1){1}'
if elen<length(exp) then
regexp := regexp||substr(exp,elen+1);
end if;
--ABBA,ABBBBBA
elsif regexp_like(exp,'^([[:alpha:]])([[:alpha:]])\2+\1?') then
alpha := regexp_substr(exp,'([[:alpha:]])\1+');
regexp := '([[:digit:]])([[:digit:]])\2{'||to_char(length(alpha)-1)||'}';
if substr(exp,-1,1) = substr(exp,1,1) then
regexp := regexp||'(\1)';
end if;
--ABAB 7777 也会匹配 有必要可以在输出时再判断一次
elsif regexp_like(exp,'^([[:alpha:]][[:alpha:]])\1+') and substr(exp,1,1)<>substr(exp,2,1) then
regexp := '([[:digit:]])([[:digit:]])(\1\2)' ;
if length(exp) > 4 then
regexp := regexp||'{'||(length(exp)/2-1)||'}';
end if;
--A数字A数字...
elsif regexp_like(exp,'^([[:alpha:]][[:digit:]])\1+') then
regexp := '([[:digit:]])('||substr(exp,2,1)||')';
if length(exp) > 2 then
regexp := regexp||'(\1\2){'||(length(exp)/2-1)||'}';
end if;
--AABB
elsif regexp_like(exp,'^([[:alpha:]]{2})([[:alpha:]]{2})(\1\2)+') then
regexp := '(([[:digit:]])\1([[:digit:]])\2)' ;
if length(exp) > 4 then
regexp := regexp||'(\1\2){'||(length(exp)/2-1)||'}';
end if;
--A数字..A
elsif regexp_like(exp,'^([[:alpha:]])([[:digit:]])+\1') then
regexp := '([[:digit:]])'||substr(exp,2,length(exp)-2)||'\1';
--步步高升系列 t
-- ABC(DEF..) 至少以ABC开头
elsif upper(substr(exp,1,3)) = 'ABC' then
alpha := regexp_substr(exp,'[[:alpha:]]+');
if length(gsm_number) <> length(alpha) and instr(gsm_number,regexp_substr(exp,'[[:digit:]]+$'),-1) <= 0 then
return 'N';
else
pgsm_number := regexp_substr(regexp_substr(exp,'^[[:digit:]]+') || gsm_number,'[[:digit:]]+');
end if;
icount := 1;
--遍历号码
for i in 1..length(pgsm_number) loop
if icount = length(alpha) then
return 'Y';
end if;
if to_number(substr(pgsm_number,i,1)) +1 =to_number(substr(pgsm_number,i+1,1)) then
icount := icount +1;
-- 如果不能连续符合条件即返回N
else
if icount >1 then
return 'N';
end if;
end if;
end loop;
return 'N';
--(..ED)CBA 至少以CBA结尾
elsif upper(substr(exp,-3)) = 'CBA' then
alpha := regexp_substr(exp,'[[:alpha:]]+');
if length(gsm_number) <> length(alpha) and instr(gsm_number,regexp_substr(exp,'^[[:digit:]]+')) <= 0 then
return 'N';
else
pgsm_number := regexp_substr(gsm_number,'[[:digit:]]+'||regexp_substr(exp,'^[[:digit:]]+'));
end if;
icount := 1;
--遍历号码
for i in 1..length(pgsm_number) loop
if icount = length(alpha) then
return 'Y';
end if;
if to_number(substr(pgsm_number,i,1)) -1 =to_number(substr(pgsm_number,i+1,1)) then
icount := icount +1;
-- 如果不能连续符合条件即返回N
else
if icount >1 then
return 'N';
end if;
end if;
end loop;
return 'N';
-----------其他----------------
else
return 'N';
end if;
-- dbms_output.put_line('reg:'||regexp);
-- 是否匹配正则
if regexp_like(gsm_number,regexp)
then
return 'Y';
else
return 'N';
end if;
end fliter_gsm_number;
测试
select fliter_gsm_number('13077127788','AABB') from dual; --Y
select fliter_gsm_number('13077127788','AA1') from dual; --Y
select * from table_numbers where fliter_gsm_number(gsm_number,'AABB') = 'Y';
分享到:
相关推荐
标题中的“拍卖全球通吉祥号码”暗示了这是一个与电信服务相关的活动,可能涉及到特定的电话号码,这些号码可能因为其特殊性(如连续数字、寓意好运的数字组合等)而被视为“吉祥”,并进行拍卖以获取更高的价值。...
《吉祥物的设计》作为一门结合艺术、设计和文化背景的综合课程,为七年级学生提供了一个展示他们活跃思维和丰富想象力的舞台。该课程不仅仅是一堂普通的美术课,而是一次全面的设计教育体验,其目的在于让学生理解和...
【车牌号码选号吉祥计算】是一种为汽车车主提供的车牌号码选择工具,旨在帮助车主根据个人喜好和特定条件筛选出满意的车牌号码。这个程序通常具备多种筛选功能,允许用户自定义过滤标准,例如避免某些数字组合或者...
根据提供的文件信息,我们可以推断出这是一本关于激光原理的专业教材,作者为阎吉祥,出版于2004年7月,由高等教育出版社发行。虽然“部分内容”中并未给出具体的信息,但我们可以基于该书的主题——激光原理,来...
吉祥如意模板"是一款专为Discuz! 论坛系统设计的界面样式,它旨在提升用户在论坛交互过程中的视觉体验和使用感受。Discuz! 是一个非常流行的开源社区软件,用于搭建论坛、社交网络和门户站点。这款模板以其独特的...
标题中的“多媒体北京奥运吉祥物 下来菜单”指的是一个与北京奥运会吉祥物相关的多媒体项目,可能包含动画、图像、音频和交互元素等,用于展示和介绍这些可爱的象征性角色。这个项目的重点是“下来菜单”,这可能是...
"CCNA吉祥三宝拓扑"是Cisco Certified Network Associate(CCNA)认证考试中的一个重要实践环节,主要在Cisco Packet Tracer模拟环境中进行。这个拓扑通常包括三个关键组件,它们可能是一个小型网络的基础,比如...
阿里妈妈的吉祥物CVI(Corporate Visual Identity,企业视觉识别)规范是品牌视觉形象的核心指导文档,旨在确保吉祥物在各种应用场景中保持一致性和品牌识别度。这份名为“阿里妈妈吉祥物CVI手册 V1.0”的文件详细...
互联网公司吉祥物设计探析知识点解析: 一、互联网公司使用动物形象作为吉祥物的原因分析: 1. 形象可爱、造型易记、寓意美好:互联网公司在设计吉祥物时倾向于选择动物形象,因为动物形象在人类认知中通常会被...
标题中的“中国古典元素吉祥图案ppt素材.rar”表明这是一个压缩包文件,包含了用于制作PPT的素材,这些素材主要以中国古典元素为主题,且具有吉祥的寓意。在描述中,我们可以详细了解到这些素材的具体内容: 1. **...
2010年发布的“吉祥如意”模板,显然旨在为用户带来好运和喜庆的视觉体验,适用于个人博客、企业官网或者节日主题的网站。这种模板通常包含了预设的颜色方案、布局结构、图片、字体样式以及交互元素等,使得设计师...
【标题】:“吉祥马通用收信系统要的拿去” 【描述】:“吉祥马收信系统吉祥马通用收信系统吉祥马通用收信系统” 从标题和描述中我们可以推测,“吉祥马通用收信系统”是一个专门用于接收邮件的软件或服务,可能由...
数字电子技术(高吉祥)课后答案4.pdf
吉祥航空作为国内民航领域的一支重要力量,在2019年度的发展情况备受行业内外关注。通过对公司2019年年度报告的深入分析,我们不仅可以了解吉祥航空在上一财年的整体业绩表现,更能够洞察公司的发展方向以及未来可能...
吉祥抽奖软件是一款简单好用的抽奖软件。软件支持姓名抽奖、手机抽奖、数字抽奖、姓名 手机抽奖、姓名 部分抽奖等各种模式的抽奖形式,支持对奖品图片、字体、标题、字号等属性设置进行任意的修改,适用于年会抽奖、...
【标题】和【描述】提及的是对历届奥运会吉祥物的经营案例分析,特别是汉城、悉尼和雅典三届奥运会。这些案例涉及到吉祥物的商业价值、市场营销策略以及知识产权保护,这些都是体育赛事管理和品牌营销的重要组成部分...
标题“2011吉祥如意PPT模板下载”与描述“2011吉祥如意PPT模板下载”共同指向一个主题,即一个设计为2011年使用、具有吉祥如意主题的PowerPoint演示文稿模板。这个模板可能是为了各种场合,如新年庆祝、企业报告、...
真实的世界V4.0 兔年吉祥版 真实的世界V4.0 兔年吉祥版 真实的世界V4.0 兔年吉祥版 真实的世界V4.0 兔年吉祥版
在设计资源领域,针对这一主题的背景模板通常会融合中国传统图案和元素,如中国传统花纹、各种吉祥物、对联、福字、灯笼以及中国结等,这些都是中国文化中寓意美好和吉祥的象征。将这些元素整合进网页背景模板,不仅...
Python绘制吉祥物源码,需要turtle模块