【问题标题】:duplicate oacle sql value重复的 oracle sql 值
【发布时间】:2021-02-12 17:51:09
【问题描述】:

我有一个具有不同值的 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 也是如此,以此类推,我应该为每个结果只设置一个值。

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

提前感谢您的帮助:)

【问题讨论】:

  • 请通过以表格形式清楚地显示示例数据来解决您的问题。

标签: sql oracle duplicates extract instr


【解决方案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' 列必须是 '/' 的情况。

【讨论】:

    【解决方案2】:

    这是另一种使用 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.
    

    【讨论】:

      猜你喜欢
      • 2018-06-29
      • 1970-01-01
      • 2014-04-08
      • 1970-01-01
      • 1970-01-01
      • 2022-08-15
      • 2016-07-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多