2

我有一种情况,我想通过在 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

4

1 回答 1

3

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

您可以尝试这样的事情:
这是一个 sqlfiddle 演示

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;
于 2013-04-25T04:32:40.150 回答