ORDER BY DECODE単一列のクエリに(BLAH、[列数])。それがどのように動作しますか?
質問
こんにちは、私の必要性のヘルプ次のようなものになり、クエリのデコード部分を理解することがます。
SELECT ax.animal_code
FROM raw_animal_xref ax,
animal_xref_type axt
WHERE ax.animal_mnemonic = l_animal_mnemonic -- Example 'COUGAR'
AND ax.animal_code_type = axt.animal_code_type
ORDER BY DECODE (animal_type,
l_type_to_be_matched, -1, -- Example 'CATS'
l_current_type, 0, -- Example 'BIG CATS'
nvl(axt.type_search_priority, 100)) ASC; -- EXAMPLE 'Big Cats' Priority is 1
このクエリが返すのみ1クエリので、私は上の困惑少しだかDECODEによって提供されるさまざまな非既存の列番号と作品BY ORDER。クエリは、現在の動物の種類やタイプはと照合するニーモニック動物を与えられた問題の動物のためのユニークなコードを見つけるために、カーソルとして働きます。
私はDECODEがでORDER BYに異なる列番号を返し、私は「-1」、「0」と「100」によるORDERといくつかの他のテーブル上の別の簡単な単一列の選択を試してみましたとことを考えていますよるORDERは、それが仕事-1またはその他の数の任意のないのはなぜ?
0と100で失敗するようですホープ誰かが私にこれを説明することができます。ありがとう!
解決
これは、発注のために使用されるセットを作成します。
animal_type = l_type_to_be_matched、使用-1その行
のソート値として場合
それ以外の場合animal_type = l_current_type、その行の
のソート値として使用する0
他axt.type_search_priorityがnullの場合、その行
のソート値として100を使用します
その行のソート値として、他の利用axt.type_search_priority。
これは、条件付きソートcirteriaの種類を提供します。多くの場合、特定の項目がソートセットの上部または下部に常にあることを保証するために使用されます。
他のヒント
ORDER BYは、3つの式のいずれかを使用することができます。 選択リストの最初にエイリアス、ソース・テーブルからゼロ以上の列を使用することができる選択リスト内の列の第二の数または第三SQL式
ですから、使用 ORDER BY SUBSTR(COL、2,10) あなたは番目の文字から始まる列の値のサブ10文字でご注文ます。
同様に、使用時
ORDER BY decode(col,'DOG',1,'CAT',2,'EEL', 3, 5)
あなたが値1にDOGを翻訳し、値2にCAT、値5に値3と他人へのEEL次に(そしてその後、すなわちDOGまず、CAT、最終的にはEEL、何か他のもの)を得られた数値でオーダー。
あなたが使用して、同じ順序付けを達成することができます。
ORDER BY decode(col,'DOG','A','CAT','B','EEL', 'C', 'D')
私はDECODEが返されることを考えています ORDER BYに異なる列番号 私はAを試してみました 別の簡単な単一列の選択 ORDER BYといくつかの他のテーブルに '-1'、 '0' と '100' とORDER BY 0〜100のはなぜで失敗するようです それはで動作-1、または他の任意の 数字?
あなたの混乱は理解します。しかしない、DECODEによって返される値は、列番号として解釈されない。
Oracleは、結果セットの列がORDER BY句で位置を参照することができる小さな構文上のショートカットをサポートしています。ですから、例えば、この:
SELECT a, b FROM some_table ORDER BY 1,2
は同じです
SELECT a, b FROM some_table ORDER BY a,b
しかし、この位置表記のみ非負整数リテラルを用いて行うことができます。 ORDER BYは、数値を生成する式が含まれている場合には、列番号として解釈されることはありませんが、実際の値とにソートします。また、負の数値リテラルは、ソート値としてではなく、列番号として解釈されます。
はSELECT * FROM table ORDER BY -1
が一定値-1(効果なしソーティング)上のすべての行をソートします。
SELECT * FROM table ORDER BY 0
0は無効な列数であるため、エラーが返されます。
SELECT * FROM table ORDER BY 1
テーブルの最初の列の値のすべての行をソートします。
SELECT * FROM table ORDER BY 100
表に100番目の列の値のすべての行を並べ替える、または100の未満列がある場合はエラーを戻します。
SELECT * FROM table ORDER BY TO_NUMBER('1')
定数値1にすべての行をソートします。
私は徹底的にこれをテストしていませんが、いくつかの実行計画を見て、あなたも非整数数値リテラルを指定することができることが表示されます、そして、それは丸いダウンして、列番号として使用されます。
SELECT * FROM table ORDER BY 1.5
最初のカラムの値をソートするために表示されます。