-1

数値コンポーネントを数値としてソートする必要があるテキスト列をソートしたいと考えています。ソート結果は次のようになります。

chr1
chr1,chr1
chr1,chr2
chr1,chr10
chr2
chr2,chr1
chr2,chr2
chr2,chr10
chr6
chr6,chr1
chr6_ux9
chr6_ux9,chr1
chr7
chr10
chr10,chr1
chr10,chr2
chr10,chr10
chr21
chr21,chr1
chr21,chr2
chr21,chr10
chrx
chrx,chr1
chrx,chr2
chrx,chr10
chry
chry,chr1
chry,chr2
chry,chr10
chrmt
chrmt,chr1
chrmt,chr2
chrmt,chr10
chr25
chr25,chr1
chr25,chr2
chr25,chr10

次の規則が適用されます。

  1. chrxとして扱われますchr22
  2. chryとして扱われますchr23
  3. chrmtとして扱われますchr24
  4. chr6_ux9後に来る特別なケースですchr6

さまざまな方法を試しましたが、完璧な解決策を見つけることができませんでした。誰かがアイデアを持っているなら、私を助けてください。

4

2 に答える 2

2

私は今、あなたが探しているものを理解していると思います。数値コンポーネントを文字列ではなく数値としてソートする必要があります。これはあなたのために働くはずです:

SELECT col1
FROM   tbl
ORDER  BY string_to_array(
             replace(replace(replace(replace(replace(replace(
                col1
              , 'chrx',     'chr22')
              , 'chry',     'chr23')
              , 'chrmt',    'chr24')
              , 'chr6_ux9', 'chr6.6')
              , ' chr',     'chr')
              , 'chr',      '')
           , ',')::real[];

クエストに示されているように列を並べ替えます。テキストコンポーネント(「chr」)は冗長ノイズであることが判明しました。ORDER BYすべての置換を適用した後、ノイズを取り除き、句で使用できる数値配列にキャストします。

リストされた置換を実行している間、の特殊なケースでは、タイプがとの間にスペースを残さないため、より単純で高速なchr6_ux9の代わりにを強制的に使用します。また、コンマの代わりにスペースを含む1つの列があります。私もその代わりを追加しました。しかし、それはおそらく単なるタイプミスです。関係のない文字列を削除した後は、カンマ区切りの数値のみが残り、にキャストできます。real[]int[]integer67chrreal[]

ところで、replace()非常に高速です。何十ものreplace()操作が連続して実行され、それでも高速に実行される関数があります。(regexp_replace()はるかに遅いです。)


個々の要素を並べ替えるための代替回答

すべての値を文字列としてソートされた出力の場合:

SELECT regexp_split_to_table(replace(replace(replace(
          col1
        ,'chrx', 'chr22')
        ,'chry', 'chr23')
        ,'chrmt', 'chr24')
        , ',') AS col1
FROM   tbl
ORDER  BY 1

chr6_ux9chr6このシナリオでは自動的に後になります。

于 2012-05-01T18:45:34.207 に答える
1

つまり、完全なデータモデルではありません...適切な正規化モデルを使用してこれを修正する必要がありますが、配列データ型を使用することもできます。配列は、並べ替え、インデックス付けなどが可能です。

于 2012-05-01T18:40:24.147 に答える