从oracle sql查询的输出中删除重复值

时间:2013-04-25 01:05:31

标签: sql oracle oracle10g

我有一种情况,我希望通过在oracle 10g中使用sql查询从结果中删除重复的记录。我正在使用正则表达式从结果中删除字母

  

原始值= 1A,1B,2C,2F,4A,4z,11A,11B

当前的SQL查询

select REGEXP_REPLACE( tablex.column, '[A-Za-z]' , '' )
from db1

给我以下输出

  

1,1,2,3,4,4,11,11

如何从输出中删除重复以仅显示唯一值 即

  

1,2,3,4,11

1 个答案:

答案 0 :(得分:3)

假设您的表包含值以逗号分隔的字符串。

您可以尝试这样的事情:
Here is a sqlfiddle demo

select rtrim(xmltype('<r><n>' || 
               replace(REGEXP_REPLACE( col, '[A-Za-z]' , '' ), ',', ',</n><n>')||',</n></r>'
              ).extract('//n[not(preceding::n = .)]/text()').getstringval(), ',')
from tablex;

它的作用是在使用regexp_replace之后从中创建xmltype,然后使用XPATH获取所需的输出。

如果您还想对值进行排序(并且仍然使用xml方法),那么您需要XSL

select rtrim(xmltype('<r><n>' || 
               replace(REGEXP_REPLACE( col, '[A-Za-z]' , '' ), ',', '</n><n>')||'</n></r>'
              ).extract('//n[not(preceding::n = .)]')
.transform(xmltype('<?xml version="1.0" ?><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:template match="/"><xsl:for-each select="//n[not(preceding::n = .)]"><xsl:sort select="." data-type="number"/><xsl:value-of select="."/>,</xsl:for-each></xsl:template></xsl:stylesheet>'))
.getstringval(), ',')              
from tablex;

但您也可以尝试不同的方法,例如将标记拆分为行然后重新收集它们

select rtrim(xmlagg(xmlelement(e, n || ',') order by to_number(n))
              .extract('//text()'), ',')
from(
SELECT distinct rn, trim(regexp_substr(col, '[^,]+', 1, level)) n
  FROM (select row_number() over (order by col) rn ,
               REGEXP_REPLACE( col, '[A-Za-z]' , '' ) col
        from tablex) t
CONNECT BY instr(col, ',', 1, level - 1) > 0
)
group by rn;