oracle 我想把这个字段里面按/拆开,然后分组统计 如何实现呀

大哥大姐们帮我教一下,oracle 我想把这个字段里面按/拆开,然后分组统计 如何实现呀
最新回答
相爱如饮酒

2024-05-04 15:05:41

先在数据库里写一个 split 函数,然后
select s,count(s)
from
(select str_split (special_equipment,'/') s from table )
group by s
order by s

下面 是 split 函数 可以 试试, 但不一定适合,自己可以改改

CREATE OR REPLACE TYPE str_split_array IS TABLE OF VARCHAR2 (4000);

CREATE OR REPLACE FUNCTION str_split (p_str IN VARCHAR2, p_delimiter IN VARCHAR2)
RETURN str_split_array
IS
j INT := 0;
i INT := 1;
len INT := 0;
len1 INT := 0;
str VARCHAR2 (4000);
split_array str_split_array := str_split_array ();
BEGIN
len := LENGTH (p_str);
len1 := LENGTH (p_delimiter);

WHILE j < len
LOOP
j := INSTR (p_str, p_delimiter, i);

IF j = 0
THEN
j := len;
str := SUBSTR (p_str, i);
split_array.EXTEND;
split_array (split_array.COUNT) := str;

IF i >= len
THEN
EXIT;
END IF;
ELSE
str := SUBSTR (p_str, i, j - i);
i := j + len1;
split_array.EXTEND;
split_array (split_array.COUNT) := str;
END IF;
END LOOP;

RETURN split_array;
END str_split;
/

INSTR(C1,C2,I,J) 在一个
字符串
中搜索指定的字符,返回发现指定的字符的位置; C1 被搜索的字符串 C2 希望搜索的字符串 I 搜索的开始位置,默认为1 J 出现的位置,默认为1
追问
执行完函数方法之后 提示函数包处于无效状态呢
追答
能贴出来看看么。找到函数或者那个数组type 刷新下试试
追问

追答
在我这里pl/sql 可以编译这个,看看 function 中里的str_split 生没生效。
str_split用法是这么写的
select * from table(str_split('aa/bb','/')) ;
我之前写的sql语句也有问题,不好意思。我再研究研究。但是这个函数是好使得。你把之前的函数删了。再重新建一下试试。
傲忘天下

2024-05-04 11:47:35

先读取出来 然后foreach遍历分割 .split("/")
追问
在/不确定的情况下 怎么使用这个函数呢
一张萌脸祸害三年

2024-05-04 08:27:05

/的个数是不是不确定?如果可以就是适合用函数去分割了
追问
/就是不确定,我是直接想通过sql语句来操作,不写程序代码
追答
你都不确定怎么实用这种固定的函数,只能通过自己写存储过程来处理了。或者你能大致确定这个列的内容值 我帮你找一个变通的方法试试 分组统计
追问
单个值是可以确定的,但是有些是单个值组成的多个值,就是要把它拆开按单个来算 ,就是说一个值里面有三个 相当与就把他拆成三条记录
追答
我的意思是说超声刀、腹腔镜。。。这里 单个值 你是知道的 或者能从另外表中获得 我就有办法用sql 帮你一个个分开,
追问
可以从另一个表中查询得到。你是不是想用另一个里面的字段来分组 然后用LIKE
追答
对先用like 然后union all 然后分组
念如丝缕

2024-05-04 13:03:18

eeeeee