oracle字符串分割成数组_oracle中split⽅法分割字符串为多⾏
记录
发现最近⽼是写vue的东西,仔细⼀想,我是个java程序员呀。这样划⽔不对呀。所以最近研究了⼀下在oracle中可能出现的⼀些情况的对策;
其中,我发现有时候,我们在数据库中可能保存⼀些有规律的字符串,⽐如“123,321,4556,41324”类似这种,通过‘,’或者其他分隔符隔开的字符串值,但是我们业务需求是想要把这种字符串转换成[123,321,4556,41324]的数组格式,也就是查询出来的返回值是list或者list格式;
按照正常的思路,我们都会先查询出⼀个String的值,然后在java中使⽤split⽅法来实现,但是我们今天不⾛寻常路,直接要在数据库中查询出⼀个数组;
但是如何实现呢?oracle是没有split⽅法的,我⾸先想到的是⾃⼰实现⼀个split⽅法,然后在查询数据的时候直接调⽤⽅法就能实现了,但是这样不就跟先查询出来在split分割没啥区别了呢?不⾏,说好不⾛寻常路的;
然后我发现oralce中对字符串处理的⽅法中常⽤的⽅法有replace,translate,substr等
其中substr可能可以实现,那么我假设⼀下,我要使⽤SUBSTR(string,start, [length])⽅法实现切割字符串的话,那么我需要只要分隔符所在的index值,那么需要⽤indexof⽅法,但是oracle好像没有提供这个⽅法,了⼀下,发现有个instr( string1, string2 [,
start_position [, nth_appearance ] ] ) ⽅法,字符串1中字符串2在第start_position 次出现的index;nth_appearance是查⽅向,1是正向,-1是反向,那么我可以⽤instr先获取到分隔符出现的位置,然后再使⽤substr函数,但是每次使⽤的时候都需要获取到第n和n+1个分隔符的位置来获取截取长度,⽤起来好像不太⽅便,在sql⾥⾯不太好写;
于是我有没有什么其他的招式可以更⽅便的实现,嘿,我还真到⼀个⽐较⽅便的⽅法:REGEXP_SUBSTR(string, pattern, position, occurrence, modifier)
使⽤正则匹配截取字符串的⽅法,这个⽅法⽤的⽐较少,但是这个⽅法⽐substr⽅法更⽅便的地⽅就在于它是直接使⽤分隔符分割所有字符串,所以不需要分隔符的index也不需要知道截取长度,就他了;
这个⽅法怎么⽤呢?举个栗⼦:SELECT REGEXP_SUBSTR('123,321,4556,41324', '[^,]+') FROM DUAL;数组转换成字符串
->> 123
我们匹配正则‘,’号开始,多个逗号,由于正则不太熟,哈哈,后⾯两个参数先不⽤,那么我得到了字符串中分隔符隔开的第1个⼦字符串,后⾯两个参数是什么作⽤呢?其中第三个参数position是分割后的字符串起点的index,这⾥的index是从1开始的,第四个参数很重要,是分隔开之后的第⼏个字符串,也就相当于我们数组的下标,当然也是从1开始的;最后⼀个参数我觉得应该⽤的时候⽐较少,是⽤作忽略⼤⼩写的,默认是不忽略,需要忽略⼤⼩写的话就加上‘i’来标识;
这样之后,我们只需要⽤⼀个i++循环来获取第四个参数的值,就能得到我们所需的数组了DECLARE
X NUMBER;
Y NUMBER;
BEGIN
X := 0;
WHILE X < 4 LOOP
X := X + 1;
SELECT REGEXP_SUBSTR('123,321,4556,41324', '[^,]+',1,X) INTO Y FROM DUAL;
DBMS_OUTPUT.PUT_LINE(Y);
END LOOP;
END;->>123
->>321
->>4556
->>41324
结果这⼜变成了⼀个存储过程了,⽽且到底需要分割出⼏个字符串是事前不知道的,这样不⾏,想想有没有其他简单点的实现⽅法呢?
这是我突然想到了⼀个,之前我不是写过⼀个connect by吗?connect by的时候不是有⼀个level值吗?每⼀层递归的level正好拿来当做每⼀次数组下标使⽤,于是我简化出了如下⽅法:SELECT REGEXP_SUBSTR('123,321,4556,41324', '[^,]+', 1, LEVEL)
FROM DUAL
CONNECT BY REGEXP_SUBSTR('123,321,4556,41324', '[^,]+', 1, LEVEL) IS NOT NULL;
在获取结果为null的时候终⽌递归,哈哈,完美实现了不⾛寻常路的结果;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论