近期在做商旅机票平台,遇到这样一个问题:

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

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

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

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

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

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

  1. Oracle中REGEXP_SUBSTR函数(转)

    Oracle中REGEXP_SUBSTR函数 Oracle中REGEXP_SUBSTR函数的使用说明: 题目如下:在oracle中,使用一条语句实现将'17,20,23'拆分成'17','20','2 ...

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

    Oracle中REGEXP_SUBSTR函数的使用说明: 题目如下:在oracle中,使用一条语句实现将'17,20,23'拆分成'17','20','23'的集合. REGEXP_SUBSTR函数格 ...

  3. Oracle中REGEXP_SUBSTR函数(字符串转多行)

    Oracle中REGEXP_SUBSTR函数 Oracle中REGEXP_SUBSTR函数的使用说明: 题目如下: 在oracle中,使用一条语句实现将'17,20,23'拆分成'17','20',' ...

  4. Oracle中REGEXP_SUBSTR函数

    Oracle中REGEXP_SUBSTR函数 Oracle中REGEXP_SUBSTR函数的使用说明: 题目如下: 在oracle中,使用一条语句实现将'17,20,23'拆分成'17','20',' ...

  5. 记Oracle中regexp_substr的一次调优(速度提高95.5%)

    项目中需要做一个船舶代理费的功能,针对代理的船进行收费,那么该功能的第一步便是选择进行代理费用信息的录入,在进行船舶选择的时候,发现加载相关船舶信息十分的慢,其主要在sql语句的执行,因为测试的时候数 ...

  6. oracle中merge方法

    先看SQL语句:merge into employee e using emps em on (e.emp_id=em.emp_id) when matched then  update set e. ...

  7. oracle中Update方法

    1.两表(多表)关联update -- 被修改值由另一个表运算而来 update customers a set city_name=(select b.city_name from tmp_cust ...

  8. Oracle中decode方法的作用

    DECODE(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值) 该函数含义如下: IF 条件=值1 THEN    RETURN (翻译值1) ELSIF 条件=值2 THEN   ...

  9. Oracle中使用REGEXP_SUBSTR,regexp_replace函数

    REGEXP_SUBSTR函数格式如下: function REGEXP_SUBSTR(String, pattern, position, occurrence, modifier)__srcstr ...

随机推荐

  1. 2156: 中南大学2018年ACM暑期集训前期训练题集(入门题) D: 机器人的指令

    不要用gets!不要用gets!不要用gets! 不要用gets!不要用gets!不要用gets! 不要用gets!不要用gets!不要用gets! 不要用gets!不要用gets!不要用gets! ...

  2. Mysql经典sql语句大全

    DDL-数据定义语言(Create,Alter,Drop,DECLARE) DML-数据操纵语言(Select,Delete,Update,Insert) DCL-数据控制语言(GRANT,REVOK ...

  3. MyEclipse导入Maven项目以及Maven转化为Dynamic Web Module(转)

    MyEclipse导入Maven项目(这个博主写的比较详细)https://blog.csdn.net/w12345_ww/article/details/52094756 Maven转化为Dynam ...

  4. Django 日志配置按日期滚动

    记录下Django关于日期的配置,以及如何根据日期滚动切割日志的问题. 配置的源码在githun上 https://github.com/blackmatrix7/django-examples/tr ...

  5. 即将上线的Spark服务器面临的一系列填坑笔记

    即将上线的Spark服务器面临的一系列填坑笔记 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 把kafka和flume倒腾玩了,以为可以轻松一段时间了,没想到使用CDH部署的spa ...

  6. passat / maintenance / baoyang

    s s 南京迎客隆汽车租赁有限公司 / 地址:常府街54号 / 电话:025-84546836 84507610 二手车养不起.修不起?果真如此吗?http://www.che168.com/list ...

  7. Linux命令之less

    less命令 用处:查看文件,功能强大,随意浏览,查看之前不会预先加载文件 用法:less + 文件名    (按q退出) 示例: 一.查看文档内容 (我这里有一个profile的文件,我想查看里面的 ...

  8. EXISTS 与 NOT EXISTS 的用法及返回结果

    (1)SELECT * FROM `datatower-all`.TMP_DWD_POI t1 WHERE EXISTS ( SELECT 1 FROM `datatower-all`.DWD_POI ...

  9. Datatables 完整的datatables案例

    这里只做收集网上一些很棒的博客!!!真的是很棒!!! https://www.cnblogs.com/luckychan/articles/6160934.html

  10. epoll讲解--转自知乎

    Ctrip AIO底层使用epoll https://blog.csdn.net/z69183787/article/details/52943637 首先我们来定义流的概念,一个流可以是文件,soc ...