我有一种情况,我想通过在 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
假设您的表包含值用逗号分隔的字符串。
您可以尝试这样的事情:
这是一个 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;