oracle中REGEXP_SUBSTR方法的使用

最近在做商旅机票平台,遇到这样一个问题:
有一张tt_ticket表,用来存机票信息,里边有一个字段叫schedule,表示的是行程,存储格式为:北京/虹桥
由于公司位于上海,而上海目前有两个机场:浦东和虹桥,所以对于出发地或到达地为上海的机票来说,行程中会存虹桥或浦东,当然,有时候可能也会直接存上海(可能性很小,但不代表没有)。这样,行程对于出发地为上海的行程来说,可能有以下几种可能:
a.虹桥/北京
b.浦东/北京
c.上海/北京
现在要实现搜索出发城市为上海时,把这三条信息全部拉出来。
首先,创建一张城市地区映射表tt_ticket_city_mapper,包含字段city和mapper_city,存储以下数据:

citymapper_city
虹桥上海
浦东上海
上海上海

下面先把sql贴出来,是mybatis中的部分代码:

      select * 
      from tt_ticket 
      where 1=1               
<if test="departureCity !='' and departureCity !=null">
<![CDATA[  
and (nvl(
         (select   m.mapper_city 
          from    tt_ticket_city_mapper m 
          where   m.city  = trim((select                   REGEXP_SUBSTR(t.schedule,'[^/]+',1,1)
           from dual))) ,
     trim((select REGEXP_SUBSTR(t.schedule,'[^/]+',1,1) from dual))
    ) 
    = 
   nvl(
       (select m.mapper_city 
        from   tt_ticket_city_mapper m 
        where  m.city = trim(#{departureCity}) 
      ),
         #{departureCity}
       )
      )
]]>
</if>
<if test="arriveCity !='' and arriveCity !=null"> 
<![CDATA[  
and(nvl(
       (select   m.mapper_city 
        from    tt_ticket_city_mapper m 
         where   m.city  = trim((select REGEXP_SUBSTR(t.schedule,'[^/]+',1,2) from dual))
        ) ,
        trim((select REGEXP_SUBSTR(t.schedule,'[^/]+',1,2) from dual))
   ) 
     = 
   nvl(
       (select m.mapper_city 
        from   tt_ticket_city_mapper m 
        where  m.city = trim(#{arriveCity}) 
                 ),
         #{arriveCity}
        )
]]>
</if>

先解释一下:select REGEXP_SUBSTR(t.schedule,’[^/]+’,1,1) from dual
比如:
select REGEXP_SUBSTR(‘虹桥/北京’,’[^/]+’,1,1) from dual
返回的是虹桥
select REGEXP_SUBSTR(‘虹桥/北京’,’[^/]+’,1,2) from dual
返回的是北京
第一个参数是要解析的字符串,第二个是正在表达式,第三个表示字符串解析时的起始位置,比如:
select REGEXP_SUBSTR(‘虹桥/北京’,’[^/]+’,2,1) from dual
返回的是桥
第四个参数表示取拆分后数组里的第几个值。
这样的话
nvl(
(select m.mapper_city
from tt_ticket_city_mapper m
where m.city = trim((select REGEXP_SUBSTR(t.schedule,’[^/]+’,1,1) from dual))
) ,
trim((select REGEXP_SUBSTR(t.schedule,’[^/]+’,1,1) from dual))
)
就可以取出/前面的字符串,比如浦东或虹桥,然后在 tt_ticket_city_mapper中查询得到器映射的城市上海,如果没有的话就是它自己
等于号后边同样是做一下转换。
当然,看到这,肯定会有人说为什么不直接存出发城市和到达城市两个字段?那是因为行程可能是 北京/香港/迈阿密/香港/北京 这样的数据。
关于这样的数据怎么处理,还没有搞,不过在网上大致看了一下,应该是利用存储过程里边操作比较方便
大家有什么方法可以分享一下哦

<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值