【问题标题】:i need a oracle query to Remove duplicate within a value我需要一个 oracle 查询来删除一个值中的重复项
【发布时间】:2018-04-18 08:30:25
【问题描述】:
 FILM_ID    TITLE       
---------- ---------- 
    1       Frozen,Frozen         
    2       Frozen,High,Low,High 


 FILM_ID    TITLE       
---------- ---------- 
    1       Frozen
    2       Frozen,High,Low

如果值为Frozen,Frozen,我需要查询以仅冻结以及第二个值我应该有Frozen,High,Low

【问题讨论】:

  • 您首先不应该将逗号分隔的值存储在单个列中。这是一个非常糟糕的数据库设计。

标签: sql csv oracle11g split


【解决方案1】:

试试这个解决方案:

SELECT film_id, LISTAGG(title,',') WITHIN GROUP (Order BY title) TITLE
FROM 
(select distinct film_id, 
        regexp_substr(Title,'[^,]+', 1, level) as title
 from Table1
 connect by regexp_substr(Title, '[^,]+', 1, level) is not null
) t
GROUP BY film_id

输出:

FILM_ID |  TITLE
--------------------------
 1      |  Frozen
 2      |  Frozen,High,Low

演示链接:

http://sqlfiddle.com/#!4/12377c/14

【讨论】:

    【解决方案2】:

    这里有一个选项:

    • TEST 就是你的桌子
    • INTER 根据逗号分隔值创建行; DISTINCT 在这里只返回不同的值(这就是你想要的)
    • 最终查询将它们聚合回来

    SQL> with test (film_id, title) as
      2    (select 1, 'Frozen,Frozen'        from dual union
      3     select 2, 'Frozen,High,Low,High' from dual
      4    ),
      5  inter as
      6    (select distinct film_id, regexp_substr(title, '[^,]+', 1, column_value) title
      7     from test,
      8          table(cast(multiset(select level from dual
      9                              connect by level <= regexp_count(title, ',') + 1
     10                             ) as sys.odcinumberlist))
     11    )
     12  select film_id, listagg(title, ',') within group (order by title) title
     13  from inter
     14  group by film_id;
    
       FILM_ID TITLE
    ---------- ------------------------------
             1 Frozen
             2 Frozen,High,Low
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多