oracle中REGEXP_SUBSTR方法的使用
2017-06-30 12:19
344 查看
近期在做商旅机票平台,遇到这样一个问题:
有一张tt_ticket表,用来存机票信息。里边有一个字段叫schedule,表示的是行程,存储格式为:北京/虹桥
由于公司位于上海。而上海眼下有两个机场:浦东和虹桥。所以对于出发地或到达地为上海的机票来说,行程中会存虹桥或浦东,当然。有时候可能也会直接存上海(可能性非常小。但不代表没有)。这样,行程对于出发地为上海的行程来说。可能有下面几种可能:
a.虹桥/北京
b.浦东/北京
c.上海/北京
如今要实现搜索出发城市为上海时,把这三条信息所有拉出来。
首先,创建一张城市地区映射表tt_ticket_city_mapper,包括字段city和mapper_city,存储下面数据:
下面先把sql贴出来,是mybatis中的部分代码:
先解释一下: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中查询得到器映射的城市上海。假设没有的话就是它自己
等于号后边相同是做一下转换。
当然,看到这,肯定会有人说为什么不直接存出发城市和到达城市两个字段?那是由于行程可能是 北京/香港/迈阿密/香港/北京 这种数据。
关于这种数据怎么处理。还没有搞,只是在网上大致看了一下。应该是利用存储过程里边操作比較方便
大家有什么方法能够分享一下哦
有一张tt_ticket表,用来存机票信息。里边有一个字段叫schedule,表示的是行程,存储格式为:北京/虹桥
由于公司位于上海。而上海眼下有两个机场:浦东和虹桥。所以对于出发地或到达地为上海的机票来说,行程中会存虹桥或浦东,当然。有时候可能也会直接存上海(可能性非常小。但不代表没有)。这样,行程对于出发地为上海的行程来说。可能有下面几种可能:
a.虹桥/北京
b.浦东/北京
c.上海/北京
如今要实现搜索出发城市为上海时,把这三条信息所有拉出来。
首先,创建一张城市地区映射表tt_ticket_city_mapper,包括字段city和mapper_city,存储下面数据:
city | mapper_city |
---|---|
虹桥 | 上海 |
浦东 | 上海 |
上海 | 上海 |
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函数简单使用方法
- oracle中REGEXP_SUBSTR方法的使用
- Oracle 正则表达式函数-REGEXP_SUBSTR 使用例子
- Oracle 10g 使用REGEXP_SUBSTR 分拆字符串 (转)
- oracle 使用REGEXP_SUBSTR正则表达式拆分字符串
- Oracle中如何使用REGEXP_SUBSTR,listagg函数
- Oracle的REGEXP_INSTR函数简单使用方法
- Oracle 中使用 Regexp_substr 和 Connect By 来根据分隔符进行列转行操作示例
- oracle 10g 使用REGEXP_SUBSTR 分拆字符串
- Oracle 10g 使用REGEXP_SUBSTR 分拆字符串
- oracle的substr函数使用方法
- Oracle 正则表达式函数-REGEXP_SUBSTR 使用例子
- Oracle中使用REGEXP_SUBSTR,regexp_replace,wm_concat函数
- 动态传入的逗号连接的字符串,分散成多条记录(Oracle 10g 使用REGEXP_SUBSTR 分拆字符串)
- Oracle 正则表达式函数-REGEXP_SUBSTR 使用例子
- oracle SUBSTR的使用方法
- Delphi5 企业版使用BDE访问 Oracle方法
- oracle中substr()的用法和Oracle中INSTR方法
- Delphi5 企业版使用BDE访问 Oracle方法
- Java使用Oracle遇到的最大游标超出问题及其解决方法