• oracle中REGEXP_SUBSTR方法的使用


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

    city mapper_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中查询得到器映射的城市上海。假设没有的话就是它自己
    等于号后边相同是做一下转换。


    当然,看到这,肯定会有人说为什么不直接存出发城市和到达城市两个字段?那是由于行程可能是 北京/香港/迈阿密/香港/北京 这种数据。


    关于这种数据怎么处理。还没有搞,只是在网上大致看了一下。应该是利用存储过程里边操作比較方便
    大家有什么方法能够分享一下哦

  • 相关阅读:
    Java5 多线程实践
    ExtJS2.0实用简明教程 Border区域布局
    MySQL安装图解
    ExtJS2.0实用简明教程 组件的使用
    ExtJS2.0实用简明教程 ExtJS版的Hello
    Linux操作系统中如何安装Tomcat
    线程池的介绍及简单实现
    ExtJS2.0实用简明教程 获得ExtJS
    汽车常识全面介绍 动力系统
    MySQL 图形化管理工具介绍
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/7098276.html
Copyright © 2020-2023  润新知