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 に答える