带有正则表达式的Oracle sql - 获取重复记录 -

时间:2018-04-17 12:46:44

标签: sql oracle oracle11g

这是我的表记录 - 表名是temp。

1   | java,c,.net
2   | oracle,hadoop,ruby

其实我正在寻找这样的数据。

1| java
1 | c
1 | .net
2 | oracle
2| hadoop
2 | ruby

我在下面写了查询,预期结果不匹配。你可以检查验证我的查询为什么它导致deplicate,

select id,
regexp_substr(liked,'[^,]+', 1, level) from 
temp connect by regexp_substr(liked,'[^,]+', 1, level) is not null order by id 

2 个答案:

答案 0 :(得分:0)

你想做这样的事情:

 SELECT id, REGEXP_SUBSTR(liked, '[^,]+', 1, LEVEL)
   FROM temp 
CONNECT BY REGEXP_SUBSTR(liked, '[^,]+', 1, LEVEL) IS NOT NULL
    AND PRIOR id = id
    AND PRIOR SYS_GUID() IS NOT NULL
  ORDER BY id;

这种使用DISTINCT的方式不是必需的。

编辑:如果不在CONNECT BY子句中使用随机数,您将收到错误,因为Oracle会认为它是无限循环。

答案 1 :(得分:0)

要获得您正在寻找的确切结果,您需要使用DISTINCT并且您需要在ID中按LEVEL排序:

SELECT ID, LIKED
  FROM (select DISTINCT id, level, regexp_substr(liked,'[^,]+', 1, level) as liked
          from temp
          connect by regexp_substr(liked,'[^,]+', 1, level) is not null
          order by id, level);

SQLFiddle here

祝你好运。