oracle 如何将一个字段里的值拆分为多个值显示出来

供稿:hz-xin.com     日期:2024-05-04
oracle 如何将一个字段内容拆分多行显示

用正则表达式,应该能解决你的问题
例子,供参考,具体稍作调整
select regexp_substr('01 a;02 b;03 c;04 d', '[^;]+', 1, level)
from dual
connect by level <= regexp_count('01 a;02 b;03 c;04 d', '[^;]+')

1、首先需要sys或system权限操作
2、查询需要更改表的ID
select object_id from all_objects where owner = 'ITHOME'and object_name = 'TEST';1234
注:ITHOME为用户,TEST是要更改的表,表名要大写
3、通过ID查出该表所有字段的顺序
select obj#, col#, namefrom sys.col$where obj# = '103756' order by col#123

4、修改顺序
update sys.col$ set col#=2 where obj#=103756 and name='AGE';update sys.col$ set col#=3 where obj#=103756 and name='NAME';12
或直接在第三步的语句后面加 for update 进行修改
最后commit提交 并且重启Oracle服务

直接使用拼接的方法来解决此问题。

如下参考:

1.新的PHP文件,如下所示。

2.声明数组变量,如下图所示。

3.使用内爆函数将数组连接到具有连接字符-的字符串中。

4.输出连接后的字符串,如下图所示。

5.预览效果如图所示。

6.用implode函数使数组拼接成字符串,连接符为?完成如下。



with temp as
(
select name as text from a
)
select substr(text,instr(text,',',1,rn)+1,instr(text,',',1,rn+1)-instr(text,',',1,rn)-1) text from
(
select ','||t1.text||',' text,t2.rn from
(select text,length(text)-length(replace(text,',',''))+1 rn from temp) t1,
(select rownum rn from all_objects where rownum <= (select max(length(text)-length(replace(text,',',''))+1) rn from temp)) t2
where t1.rn >= t2.rn order by text,rn
)

用这种方法可以处理name这一列,如果你想ID、NAME都先显示的话,就要写成一个函数来调用了。

这个一条SQL我没实现过,
原来项目中遇到过类似的需求,也是在网上找的,这么解决的
首先建立一个type
CREATE OR REPLACE TYPE "TY_STR_SPLIT" IS TABLE OF VARCHAR2 (4000);
然后建立一个函数

CREATE OR REPLACE FUNCTION fn_split (p_str IN VARCHAR2, p_delimiter IN VARCHAR2)
RETURN ty_str_split
--功能描述:用指定分隔符切割输入的字符串,返回一维数组,每个数组元素为一个子串。

IS
j INT := 0;
i INT := 1;
len INT := 0;
len1 INT := 0;
str VARCHAR2 (4000);
str_split ty_str_split := ty_str_split ();
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);
str_split.EXTEND;
str_split (str_split.COUNT) := str;

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

RETURN str_split;
END fn_split;

然后使用查询TABLE函数
SELECT * FROM TABLE (CAST (fn_split ('a,b,c', ',') AS ty_str_split ) );

可以达到类似的效果。

我觉得这种存储后展现方式违反数据库设计范式了。

id 是主键么?是主键能那么整吗?