1

我有一个具有不同值的 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依此类推,每个结果我应该只有一次值。

突然间我没有阻止,因为我不知道我的请求有什么问题。

预先感谢您的帮助 :)

4

2 回答 2

1

您可以使用以下查询:

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' 列必须是 '/' 的情况。

于 2020-10-30T09:51:47.903 回答
0

这是使用 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 || '})', 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.
于 2020-10-30T14:41:58.597 回答