sql - Oracle 9i 中的 REGEXP_SUBSTR 函数等效?
问题描述
regexp_substr
Oracle 9i 中是否有等效的功能。
我知道regexp_substr
从 Oracle 10g 开始。
试图找出一种方法,如果我可以在 Oracle 9i 中使用相同的功能逻辑。
我有类似的数据
0/6/03/19
0/6/3/19
0/1/3/09
我想通过用 / 分隔字符串来分别挑选出这些值。
我尝试使用substr
,instr
但它不会是通用的,因为斜杠之间的字符串长度可以改变。
解决方案
不幸的是,您只能使用instr
和substr
组合:
with t as
(
select '0/6/03/19' as str from dual union all
select '0/6/3/19' from dual
)
select substr(str,1,instr(str,'/',1,1)-1) str1,
substr(str,instr(str,'/',1,1)+1,instr(str,'/',1,2)-instr(str,'/',1,1)-1) str2,
substr(str,instr(str,'/',1,2)+1,instr(str,'/',1,3)-instr(str,'/',1,2)-1) str3,
substr(str,instr(str,'/',1,3)+1,length(str)-instr(str,'/',1,3)) str4
from t;
STR1 STR2 STR3 STR4
---- ---- ---- ----
0 6 03 19
0 6 3 19
PS 如果您的数据库版本是 9.2,则with .. as
可以使用上述结构。
您还可以按行(以unpivot 方式)获得结果:
with t as
(
select '/'||str||'/' as str, ID
from
(
select 1 as ID, '0/6/03/19' as str from dual union all
select 2,'0/6/3/19' from dual
)
)
select
distinct ID, level as piece_nr,
substr(str,instr(str,'/',1,level)+1,instr(str,'/',1,level+1)-instr(str,'/',1,level)-1)
as piece_value
from ( select * from t )
connect by level <= length(str)-length(replace(str,'/',''))-1
order by ID, level;
ID PIECE_NR PIECE_VALUE
-- -------- -----------
1 1 0
1 2 6
1 3 03
1 4 19
2 1 0
2 2 6
2 3 3
2 4 19
推荐阅读
- java - 如何将多个类添加到 Generic ArrayList?
- generics - Kotlin,定义具有扩展泛型的类类型的对象
- vue.js - 如何将异步值从显示传递到方法 - Vue?
- java - Propagate transaction to Forkjoin submit
- android - 用飞镖/颤振制作电话信标
- javascript - 领域对象列表函数未定义,即使对象已定义且列表已填充
- python - 将单个列表转换为嵌套列表
- git - 如果两者中都存在一些新文件,如何将本地更改与远程合并?( 混帐 )
- java - 无法访问内部类中的变量而不使其成为最终变量
- python - 如何在 Anaconda 包管理器中解决 ModuleNotFoundError