我有一个具有不同值的实体字段,如下所示:
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也是如此,所以对于每个结果,我应该只有一个值。
突然我不再阻塞了,因为我不知道我的请求出了什么问题。
提前感谢您的帮助:)
发布于 2020-10-30 17:51:48
您可以使用以下查询:
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是可以的,但是它为level的所有值提供了相同的结果,而您只需要使用'ch‘列必须为'/’的情况。
发布于 2020-10-30 22:41:59
这是使用REGEXP_SUBSTR()的另一种方法。如你所知,根据分隔符"/“为每个元素使用”循环“进行连接。对于这些迭代中的每一次,它都会从字符串的开头返回,直到迭代计数的分隔符为on,然后使用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.https://stackoverflow.com/questions/64605463
复制相似问题