首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重复的oacle SQL值

重复的oacle SQL值
EN

Stack Overflow用户
提问于 2020-10-30 17:08:36
回答 2查看 32关注 0票数 1

我有一个具有不同值的实体字段,如下所示:

代码语言:javascript
复制
Orange/OBS/SCE/CSO/ESC/STI/CSE/TE
Orange/ODT/GSE
Orange/FGI
Orange/DSE/FGE/CSO/

如果我们举第一个例子:

代码语言:javascript
复制
Orange OBS/SCE/CSO/ESC/STI/CSE/TE

我希望最后能有这样的结果:

代码语言:javascript
复制
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查询,但是我得到了更多的重复,而不是只有一个值:

代码语言:javascript
复制
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

我得到了以下结果:

代码语言:javascript
复制
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也是如此,所以对于每个结果,我应该只有一个值。

突然我不再阻塞了,因为我不知道我的请求出了什么问题。

提前感谢您的帮助:)

EN

回答 2

Stack Overflow用户

发布于 2020-10-30 17:51:48

您可以使用以下查询:

代码语言:javascript
复制
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='/'
/

结果是

代码语言:javascript
复制
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是可以的,但是它为level的所有值提供了相同的结果,而您只需要使用'ch‘列必须为'/’的情况。

票数 1
EN

Stack Overflow用户

发布于 2020-10-30 22:41:59

这是使用REGEXP_SUBSTR()的另一种方法。如你所知,根据分隔符"/“为每个元素使用”循环“进行连接。对于这些迭代中的每一次,它都会从字符串的开头返回,直到迭代计数的分隔符为on,然后使用trim()去掉后面的"/“。

代码语言:javascript
复制
WITH tbl(str) AS (
  SELECT 'Orange/OBS/SCE/CSO/ESC/STI/CSE/TE' FROM dual
)
SELECT RTRIM(REGEXP_SUBSTR(str, '(([^/]*(/|$)){' || LEVEL || '})', 1, 1, 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.
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64605463

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档