我有一种情况,我希望通过在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
答案 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;