如何解决重复的Oacle SQL值
我有一个具有不同值的ENTITY字段,如下所示:
Orange/OBS/SCE/CSO/ESC/STI/CSE/TE
Orange/ODT/GSE
Orange/FGI
Orange/DSE/FGE/CSO/
如果我们举第一个例子:
Orange OBS/SCE/CSO/ESC/STI/CSE/TE
我想最后得到这个结果:
ORANGE
ORANGE/OBS
ORANGE/OBS/SCE
ORANGE/OBS/SCE/CSO
ORANGE/OBS/SCE/CSO/ESC/STI
Orange/OBS/SCE/CSO/ESC/STI/CSE
Orange/OBS/SCE/CSO/ESC/STI/CSE/TE
我编写了以下SQL查询,但得到的重复次数更多,而不是只有一个值:
select
substr( 'Orange/OBS/SCE/CSO/ESC/STI/CSE/TE',1,INSTR( 'Orange/OBS/SCE/CSO/ESC/STI/CSE/TE','/',-level)) AS DECOMPOSITION_ENTITY
from (select distinct 'Orange/OBS/SCE/CSO/ESC/STI/CSE/TE' from dual )
connect by INSTR( 'Orange/OBS/SCE/CSO/ESC/STI/CSE/TE',-level ) >0
我得到以下结果:
DECOMPOSITION_ENTITY
Orange/OBS/SCE/CSO/ESC/STI/CSE/
Orange/OBS/SCE/CSO/ESC/STI/CSE/
Orange/OBS/SCE/CSO/ESC/STI/CSE/
Orange/OBS/SCE/CSO/ESC/STI/
Orange/OBS/SCE/CSO/ESC/STI/
Orange/OBS/SCE/CSO/ESC/STI/
Orange/OBS/SCE/CSO/ESC/STI/
Orange/OBS/SCE/CSO/ESC/
Orange/OBS/SCE/CSO/ESC/
Orange/OBS/SCE/CSO/ESC/
Orange/OBS/SCE/CSO/ESC/
Orange/OBS/SCE/CSO/
Orange/OBS/SCE/CSO/
Orange/OBS/SCE/CSO/
Orange/OBS/SCE/CSO/
Orange/OBS/SCE/
Orange/OBS/SCE/
Orange/OBS/SCE/
Orange/OBS/SCE/
Orange/OBS/
Orange/OBS/
Orange/OBS/
Orange/OBS/
Orange/
Orange/
Orange/
Orange/
Orange /
应该只出现一次,与Orange / OB
相同,依此类推,对于每个结果,我都应该只有一个值。
突然我不阻止,因为我不知道我的请求出了什么问题。
在此先感谢您的帮助:)
解决方法
您可以使用以下查询:
select DECOMPOSITION_ENTITY
from (select INSTR( x,'/',-level ) inst,substr(x,-level,1) ch,substr( x,1,INSTR( x,-level)) AS DECOMPOSITION_ENTITY,level
from (select 'Orange/OBS/SCE/CSO/ESC/STI/CSE/TE' x from dual )
connect by INSTR( x,-level ) >0
) where ch='/'
/
结果是
DECOMPOSITION_ENTITY
--------------------------------------------------
Orange/OBS/SCE/CSO/ESC/STI/CSE/
Orange/OBS/SCE/CSO/ESC/STI/
Orange/OBS/SCE/CSO/ESC/
Orange/OBS/SCE/CSO/
Orange/OBS/SCE/
Orange/OBS/
Orange/
要了解为什么得到显示的结果,请从上面显示的查询中运行内部查询。您会看到substr没问题,但是对于所有级别的值,它都会给您相同的结果,而您只希望我使用的'ch'列必须为'/'的情况。
,这是使用REGEXP_SUBSTR()的另一种方法。如您所知,CONNECT BY基于定界符“ /”为每个元素“循环”。对于这些迭代中的每一个,它都从字符串的开头返回,直到迭代计数的分隔符打开为止,然后仅使用trim()来消除尾随的“ /”。
WITH tbl(str) AS (
SELECT 'Orange/OBS/SCE/CSO/ESC/STI/CSE/TE' FROM dual
)
SELECT RTRIM(REGEXP_SUBSTR(str,'(([^/]*(/|$)){' || LEVEL || '})',NULL,1),'/') STRING
FROM tbl
CONNECT BY LEVEL <= REGEXP_COUNT(str,'/') + 1;
STRING
---------------------------------
Orange
Orange/OBS
Orange/OBS/SCE
Orange/OBS/SCE/CSO
Orange/OBS/SCE/CSO/ESC
Orange/OBS/SCE/CSO/ESC/STI
Orange/OBS/SCE/CSO/ESC/STI/CSE
Orange/OBS/SCE/CSO/ESC/STI/CSE/TE
8 rows selected.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。