2012-02-15 11 views
2

2つの数値列に基づいてソートされる表があります(列Xおよび列Yと呼びます)。各行では、2つの列の両方に数値(この場合はX < = Y)を指定するか、列の1つをNULLにすることができます。SQL:2列のインターレース値に基づくORDER BY

例データ:

 X  Y 
    ----- ----- 
... NULL 26 
... 31 NULL 
... 1  7 
... 39 46 
... NULL 36 
... 15 16 
... NULL 14 
... 23 29 

私は列が「正しく」をインターリーブするように、このデータをソートしたいと思います。具体的には:そうで

1)Xの値は、両方の列に存在する場合、X.

2に基づく順序)、Y値はY.

に基づいて、両方の行の順序で存在する場合3)それ以外の場合は、利用可能なX値と利用可能なY値を比較します。

例の「正しい」ソートデータは次のようになります。

 X  Y 
    ----- ----- 
... 1  7 
... NULL 14 
... 15 16 
... NULL 26 
... 23 29 
... 31 NULL 
... NULL 36 
... 39 46 

ORDER BY句では、この分類を実行するための任意の簡単な方法はありますか?

+1

どこに '... 25 NULL'を配置しますか? –

+0

23/29から31/NULLになります。両方の行に値が設定されている場合は、X列でソートすることが優先されます。明確にする:目標は、2つの列のそれぞれの値がその列の他の値に対してソートされることになります。明白な理由から、これはX列では常に可能であり、通常はY列で「閉じる」ことが可能です - 25/27を検討してください。たとえこれがY列の誤った順序付けを引き起こすとしても、23/29以降にしなければならないだろう。 – VeeArr

答えて

5

できません。注文がうまく

が定義されていない簡単なセット

5 10 
7 null 
null 8 

あなたはソート開始する場所に応じて

null 8 
5 10 
7 null 

5 10 
7 null 
null 8 

をソートすることができます。

可能であれば、ソート基準を「X(利用可能であれば)」に変更します。それ以外の場合はY」に変更します。次に、 "mu is too short"と示唆されるようにCOALSECE演算子を使用できます。 (order by coalesce(x, y)

+1

ええ、最終的な順序は、どの行が他のどの行と比較されるかによって異なりますので、セット全体のプロパティではなく、「ソート」プロセスの成果物です。いいカウンターの例。 –

+0

私は恐れていたかもしれません。並べ替え操作を推移的にするための合理的な方法を提案することはできますか?たとえば、デモンストレーションしたように、特定のデータセットに対して複数の「正しい」並べ替えを選択することができます。どちらも私の目的にも同じように有効です(最初のものは私がやろうとしていることの精神にあります)。入力並べ替えに関係なく同じ出力を出せるように、私がレイアウトした「並べ替え規則」を変更する方法はありますか? – VeeArr

関連する問題