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中查询得到器映射的城市上海。假设没有的话就是它自己

等于号后边相同是做一下转换。

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

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

大家有什么方法能够分享一下哦

时间: 2024-11-10 12:02:26

oracle中REGEXP_SUBSTR方法的使用的相关文章

Oracle中REGEXP_SUBSTR及其它支持正则表达式的内置函数小结

Oracle中REGEXP_SUBSTR函数的使用说明: 题目如下:在oracle中,使用一条语句实现将'17,20,23'拆分成'17','20','23'的集合. REGEXP_SUBSTR函数格式如下:function REGEXP_SUBSTR(String, pattern, position, occurrence, modifier)__srcstr :需要进行正则处理的字符串__pattern :进行匹配的正则表达式,匹配的值将返回,返回策略由__occurrence决定__po

Oracle中REGEXP_SUBSTR函数(转)

Oracle中REGEXP_SUBSTR函数 Oracle中REGEXP_SUBSTR函数的使用说明: 题目如下:在oracle中,使用一条语句实现将'17,20,23'拆分成'17','20','23'的集合. REGEXP_SUBSTR函数格式如下:function REGEXP_SUBSTR(String, pattern, position, occurrence, modifier)__srcstr :需要进行正则处理的字符串__pattern :进行匹配的正则表达式__positio

oracle中merge方法

先看SQL语句:merge into employee e using emps em on (e.emp_id=em.emp_id) when matched then  update set e.emp_name=em.emp_name when not matched then insert values (em.emp_id,em.emp_name) 1.将emps表中的数据更新到employee表中,以主键匹配,如果主键匹配就执行update语句,如果不匹配则执行insert语句,需要

oracle中Update方法

1.两表(多表)关联update -- 被修改值由另一个表运算而来 update customers a set city_name=(select b.city_name from tmp_cust_city b where b.customer_id=a.customer_id) where exists (select 1 from tmp_cust_city b where b.customer_id=a.customer_id) 实例: update bd_psndoc set bd_

oralce逗号分割变多行 Oracle中REGEXP SUBSTR函数

Oracle中REGEXP_SUBSTR函数 Oracle中REGEXP_SUBSTR函数的使用说明: 题目如下: 在oracle中,使用一条语句实现将'17,20,23'拆分成'17','20','23'的集合. REGEXP_SUBSTR函数格式如下: function REGEXP_SUBSTR(String, pattern, position, occurrence, modifier) __srcstr     :需要进行正则处理的字符串 __pattern    :进行匹配的正则表

Oracle中Integer类型/DBNull的处理方法

1. 以前我一直以为 integer=number(38,0) --38是number的最大精度 integer 是个超大的数据类型,最大可以表示为power(10,126)-1 因为一个字节最大表示256,那么N个字节最大表示power(256,n)>=power(10,126) n=53,一个integer类型最少使用53个字节. 所以Integer类型还是尽量少用,一般很少用到这么大的数字.特别是某些人对于boolean类型的处理: 因为Oracle的表结构中没有布尔类型,所以很多人干脆用

oracle中LAG()和LEAD()等分析统计函数的使用方法(统计月增长率)

LAG()和LEAD()统计函数能够在一次查询中取出同一字段的前N行的数据和后N行的值.这样的操作能够使用对同样表的表连接来实现,只是使用LAG和 LEAD有更高的效率.下面整理的LAG()和LEAD()样例: LAG(EXPRESSION,<OFFSET>,<DEFAULT>)SQL> select year,region,profit ,lag (profit,1) over (order by year)  as 51xit_exp from test; YEAR RE

InstallShield在MySQL和Oracle中执行SQL脚本的方法InstallShield在MySQL和Oracle中执行SQL脚本的方法

简述 InstallShield已经内建了对MySQL和Oracle的支持.但是这个功能是通过ODBC实现的,它对SQL脚本的格式要求非常严格,因此已经通过官方客户端测试的脚本在IS中执行时往往就会报错. 一般来说,数据库脚本只保证通过官方客户端测试即可,同时维护一份供IS执行的脚本费时费力.因此,考虑安装程序对两数据库的支持通过官方客户端实现. MySQL   function InstallMySQLComponent(szComponent) NUMBER nResult; STRING

oracle调用java方法的例子(下面所有代码都是在sql/plus中写)

在Oracle中调用Java程序,注意:java方法必须是static类型的,如果想在JAVA中使用system.out/err输出log. 需要在oracle 中执行"call dbms_java.set_output(5000);".一.helloWord1 编写JAVA程序,也是在SQL/PLUS中写,并执行. create or replace and compile Javasource named hello as public     class   Hello    {