12

こんにちは私は次のようなクエリのデコード部分を理解するのに助けが必要です。

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によって提供される存在しないさまざまな列番号でORDERBYがどのように機能するかについて少し困惑しています。クエリはカーソルとして機能し、現在の動物の種類と一致する種類の動物のニーモニックを指定して、問題の動物の一意のコードを見つけます。

DECODEは異なる列番号をORDERBYに返すと考えており、ORDER by'-1'、 '0'、および '100'を使用して、他のいくつかのテーブルで別の単純な単一列選択を試してみました。 0と100で失敗します。-1またはその他の数値で機能するのはなぜですか。

誰かが私にこれを説明できることを願っています。ありがとう!

4

3 に答える 3

6

ORDER BYは、3つの式のいずれかを使用できます。最初に選択リストのエイリアス、次に選択リストの列の番号、または3番目にソーステーブルの0個以上の列を使用する可能性のあるSQL式。

したがって、ORDER BY SUBSTR(col、2,10)を使用する場合は、2番目の文字から始まる列値の10文字の部分文字列で並べ替えます。

同様に使用する場合

ORDER BY decode(col,'DOG',1,'CAT',2,'EEL', 3, 5)

DOGを値1に、CATを値2に、EELを値3に、その他を値5に変換します。次に、結果の数値で並べ替えます(つまり、最初にDOG、次にCAT、次にEEL、最後にその他)。

を使用して同じ順序を実現できます

ORDER BY decode(col,'DOG','A','CAT','B','EEL', 'C', 'D')
于 2010-02-19T01:00:51.217 に答える
4

注文に使用されるセットを作成します。

animal_type = l_type_to_be_matchedの場合、その行の並べ替え値として-1を使用します
。それ以外の場合、animal_type = l_current_typeの場合、その行の並べ替え値として0を使用します。
それ以外の場合、axt.type_search_priorityがnullの場合、その行の並べ替え値として100を
使用します。その行のソート値としてaxt.type_search_priority。

それは一種の条件付きソート条件を与えます。多くの場合、特定のアイテムが常に並べ替えられたセットの上部または下部にあることを確認するために使用されます。

于 2010-02-19T00:36:00.917 に答える
1

あなたの質問のこの部分を参照してください:

DECODEは異なる列番号をORDERBYに返すと考えており、ORDER by'-1'、 '0'、および '100'を使用して、他のいくつかのテーブルで別の単純な単一列選択を試してみました。 0と100で失敗します。-1またはその他の数値で機能するのはなぜですか。

あなたの混乱は理解できます。ただし、いいえ、DECODEによって返される値は列番号として解釈されません。

Oracleは、結果セットの列をORDERBY句で位置的に参照できる小さな構文ショートカットをサポートしています。たとえば、これは次のとおりです。

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 00は無効な列番号であるため、エラーが返されます。

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最初の列の値でソートしているように見えます。

于 2010-02-23T15:03:02.333 に答える