2012-05-30 14 views
6

私はこれができる必要があります。javaから渡された特定のソート順でソートする方法をoracleに伝える方法は?

私は、oracleにその文字列を渡す方法があります場合、私は疑問に思う私が「3,4,5,6,1,2」

のようなIDのカンマ区切りの文字列に変換することができますJavaでリストを持っていますその文字列の並べ替え順序に基づいてsqlコードの並べ替えがありますか?

ので、このクエリ:

select t.id 
from t_test t 

は、私はそれが可能だとは思わない。このため

ID 
3 
4 
5 
6 
1 
2 

答えて

9

をあなたはJavaでクエリを変更できる場合あなたは、リスト内の各要素に対してORDER BY句でデコードを配置する必要があり

SELECT t.id 
FROM t_test t 
ORDER BY DECODE(t.id, 3, 'A', 'B') ASC, 
     DECODE(t.id, 4, 'A', 'B') ASC, 
     DECODE(t.id, 5, 'A', 'B') ASC, 
     DECODE(t.id, 6, 'A', 'B') ASC, 
     DECODE(t.id, 1, 'A', 'B') ASC, 
     DECODE(t.id, 2, 'A', 'B') ASC; 

:、あなたはこのような何かを行うことができます。各デコードの第2パラメータは、リストの1つの要素です。

+0

ええ、私はちょうど同じことに気づきました、そして、それは働いているようです! – goe

+0

これは良いですね。しかしこれは、order byがdecode()が使われる回数に適用されることを意味しますか? – Yash

+1

@Yash order by節は一度だけ適用されます。これは基本的に 'ORDER BY column1 ASC、column2 DESC、...'と同じです。 order by節が複数回適用された場合、前回は前回のものより優先されます。 – Pablo

0

ことになります。クエリでは昇順または降順のみ使用できます。しかし、あなたができることは、select * from t_test t where t.id = ?のような準備文を使用し、これをあなたのリストの各IDに対して実行し、その結果を結果リストに追加することです。

あなたはまた、そのパラメータのID

EDIT

のリストになりますもう一つのアイデアは、(自分のIDリストの小さな塊にオペレータで使用しているストアドプロシージャでこれを行うために試みることができますたぶん10人ずつ)。結果が不特定の順序で返されるので、このリストを指定された順序にもたらすカスタムコンパレータまたは別のクラスを書くことができます。次に、すべてのサブリストを1つの結果リストに連結することができます。あなたは+ 10 DBクエリをのみ必要となる100個のエントリとバッチサイズ10でリストについて

0
select t1 from (select t.id t1 from t_test t order by t.id asc); 
+0

注文はJavaから来る必要があります。 – goe

+0

データベースアクセスにはどのような技術を使用していますか? –

0

での並べ替えのためのいくつかの時間は、uが行うことができます休止 -

public String getResult(String sortOrder){ 
    SQLQuery query = getSession().createSQLQuery("select t from (select t.id t from t_test t order by t.id=:sortOrder").addScalar("name", Hibernate.STRING);  
    query.setString("sortOrder", sortOrder); 
    return (String)query.uniqueResult(); 
} 
2

このような何か:

with ordered_ids as (
    select to_number(regexp_substr ('3,4,5,6,1,2','[^,]+',1,level)) as id, level as sort_order 
    from dual 
    connect by regexp_substr ('3,4,5,6,1,2','[^,]+',1,level) is not null 
) 
select t.id 
from t_test t 
    join ordered_ids oi on oi.id = t.id 
order by oi.sort_order; 

おそらく、PreparedStatementのためのリテラル'3,4,5,6,1,2'パラメータを作ることができますが、私はそれをテストしていません。

関連する問題