2009-05-02 19 views
0

この同じquestionの重複は、同じ質問の3つの他の小さな変形を相互参照します。SQL ORDER BY発行


こんにちはすべて、

SELECT * 
    FROM (SELECT distinct gl.group_id, 
       gl.group_name, 
       gl.group_description, 
       gl.status_code, 
       gl.member_count, 
       (SELECT grpp.group_name 
         FROM test_group_relationship grel JOIN test_group grpp 
           ON grel.parent_group_id = grpp.group_id 
         WHERE grel.child_group_id = gl.group_id 
       ) AS parent_group_name, 
       gl.group_name_key, 
       gl.group_description_key 
      FROM test_group AS gl 
      WHERE gl.group_org_id = '3909' 
       AND (gl.group_name_key LIKE '%GROUP%') 
     ) AS data_set 
    ORDER BY DECODE(:sort_key, 
         'name',   'constant', 
         'description',  group_description_key, 
         'memberCount',  LPAD(member_count, 4), 
         'status',   LPAD(status_code, 4), 
         'parentGroupName', parent_group_name 
       )NULLS FIRST, 
     UPPER(SUBSTR(group_name, 1, 1)), 
     SUBSTR(group_name, 1, 1) DESC, 
     UPPER(group_name), 
     group_name DESC, 
     group_name_key, 
     ; 
を、私は申し訳ありませんが、私はこのpost.Iで新しい質問として、私の質問を入れています非常にすべてのあなたの助けが必要になりましたし、私は非常にあなたの助けに感謝

私の質問はまだ類似しています。 に基づいて動的ソートを行いたいのです。ソートするたびにさまざまなオプションの1つをデコードに持つsort_key変数。

when、sort_key:= 'name'。わかるように、定数と残りの列はORDER BY句で評価されます。

変数sort_key:= 'description'または 'memberCount' ....それぞれの値が の場合、それぞれのORDER BY LOGICは異なります。

例として、 'description'が選択されている場合、ORDER BYのソートは 'name'の場合と同様に行う必要があります。このような

例: - 簡単で

UPPER(SUBSTR(group_description, 1, 1)), 
      SUBSTR(group_description, 1, 1) DESC, 
      UPPER(group_description), 
      group_description DESC, 
      group_description_key, 

、sort_key変数が取得する-ORDER BYをロジックオプションのそれぞれは異なっていると私は今、同じSQLでそれを実装する必要があります。すべてのケースによるためとの可能であれば

オプション-ことができますが、全体を変えることが可能である場合me.Iは私が正しくあなたを理解していれば、あなたが求めている非常に

+0

何が問題なのですか?さまざまな答えを持つ – tpdi

+0

http://stackoverflow.com/questions/804110/plsql-order-by-issueの複製。残念ながら、OPは「動作しません」以外のものを指定することができません(参考質問とコメントを参照してください) – devio

+0

btwこれは2日以内に質問の5番目のバージョンです – devio

答えて

1

あなた の助けが必要です助けてくださいORDER BYリストは、ASC/DESCのバリエーションなどのバインドされたパラメータに基づいて動的に作成されます。

ソート方法に応じて異なるORDER BYで異なるクエリを実行することをお勧めします。はるかに簡単で、より速く実行されます。

あなたが求めていることを本当にしたいのであれば、ORDER BY DECODE(choice1、expression1、choice2、expression2、...)ですでに使用しているのと同じテクニックを使って、ある程度まで行うことができます。 )、ただし、式はずっと複雑でなければなりません。各式は、例えば、ソート優先順位に固定サイズのフィールドを連結した文字列を生成しなければならない:

ORDER BY DECODE('description',  UPPER(SUBSTR(group_description, 1, 1)) 
           || SUBSTR(group_description, 1, 1) 
           || RPAD(UPPER(group_description),40) 
           || RPAD(group_description_key,10) 

       ,'name',   UPPER(SUBSTR(group_name, 1, 1)), 
           || LPAD(1000-ASCII(group_name)), -- first char DESC 
           || RPAD(UPPER(group_name),20) 
           || RPAD(group_name_key,10) 

また、ASCとDESCフィールドを混合することは困難です。 LPAD(1000000 - n、7)のような何かを使用して数値フィールドの方向を切り替えることができます。ここで、1000000は任意のnよりも高い数値です。あなたがgroup_nameの最初の文字で私の例で行ったようないくつかの他のトリックをプレイすることもできます。

この手法を使用すると、データベースで索引を使用して順序を高速化できなくなります(クレイジーな関数ベースの索引を追加しない限り)。

また、私はこのアプローチを放棄し、あなたの望むORDER BY句に応じて全く異なるクエリをデータベースに送信することをお勧めします。 PL/SQLを使用している場合は、動的SQLを使用して、目的のORDER BY句で問合せを作成して実行することもできます。

EDIT:私のPL/SQLは少し錆びますが、ここでは動的SQLを使用してPL/SQLで実行する方法があります。

FUNCTION QueryGroups(sort_key in varchar2) RETURN REF CURSOR 
IS 
    sql_block VARCHAR2(2000); 
    order_by VARCHAR2(2000); 
    ret REF CURSOR; 
BEGIN 
    order_by := 
    CASE sort_key 
     WHEN 'name' 
     THEN q'{UPPER(SUBSTR(group_name, 1, 1)), 
        SUBSTR(group_name, 1, 1) DESC, 
        UPPER(group_name), 
        group_name DESC, 
        group_name_key}'; 
     WHEN 'description' 
     THEN q'{UPPER(SUBSTR(group_description, 1, 1)), 
        SUBSTR(group_description, 1, 1) DESC, 
        UPPER(group_description), 
        group_description DESC, 
        group_description_key}'; 
    END CASE; 

    sql_block = q'{SELECT * 
       FROM (SELECT distinct gl.group_id, 
       gl.group_name, 
       gl.group_description, 
       gl.status_code, 
       gl.member_count, 
       (SELECT grpp.group_name 
         FROM test_group_relationship grel JOIN test_group grpp 
           ON grel.parent_group_id = grpp.group_id 
         WHERE grel.child_group_id = gl.group_id 
       ) AS parent_group_name, 
       gl.group_name_key, 
       gl.group_description_key 
      FROM test_group AS gl 
      WHERE gl.group_org_id = '3909' 
       AND (gl.group_name_key LIKE '%GROUP%') 
     ) AS data_set }' || order_by; 

    OPEN ret for sql_block; 
    return ret; 
END QueryGroups; 
+0

ありがとうございます。私は上記のアプローチであなたのポイントを理解することができます。 また、CASEでオーダーを使用してこれを実行しようとしていましたが、実行されず、キーワード 'missing'エラーが発生しました。 –

+0

ORDER CASE BY \t \t WHEN:p_sortby = 'name' のTHEN UPPER(SUBSTR(GROUP_NAME、1、1))、 SUBSTR(GROUP_NAME、1、1)DESC、UPPER(GROUP_NAME)、group_name_key、GROUP_NAMEのDESC /*上記のTHEN句は、THENの後に1つの引数がある場合に機能します。すべての引数を持っていると機能しません。*/ /*キーワードが抜けています*/ 構文が間違っていると感じています私たちは多くの議論を通過したときに私を修正してください。 変数別に異なる値を渡す場合はどうすればいいですか?それを書いているだけの一例は、私が他のものをするのに役立ちます –

+0

あなたはそれをそうすることはできません。 THENの後のものは、単一の文字列を返す単一の式でなければなりません。 DECODEの式と同じです。列のリストにすることはできません。私の答えを注意深く読んでください。どのように||を使って連結するかを見てください。しかし、何よりも、このようにしないでください。代わりに、クエリとそのORDER BYを文字列として構築し、動的SQLを使用して実行します。 –