6

これが私ができるようにする必要があることです。

「3,4,5,6,1,2」のようなコンマ区切りのID文字列に変換できるJavaのリストがあります

その文字列をオラクルに渡し、その文字列の並べ替え順序に基づいてSQLコードを並べ替える方法があるのだろうか?

したがって、このクエリ:

select t.id
from t_test t

この順序になります

ID
3
4
5
6
1
2
4

5 に答える 5

9

Java でクエリを変更できる場合は、次のようにすることができます。

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;

リスト内の各要素の order by 句にデコードを配置する必要があります。各デコードの 2 番目のパラメーターは、リストの 1 つの要素です。

于 2012-05-30T10:24:53.540 に答える
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;

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

于 2012-05-30T10:30:01.387 に答える
0
select t1 from (select t.id t1 from t_test t order by t.id asc);
于 2012-05-30T09:52:58.693 に答える
0

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

パラメータがIDのリストになるストアドプロシージャでこれを行うこともできます

編集

もう 1 つのアイデアは、ID リストの小さなチャンク (それぞれに 10 個程度) で IN 演算子を使用することです。これは不特定の順序で結果を返すため、このリストを指定した順序にするカスタム コンパレータまたは別のクラスを作成できます。次に、すべてのサブリストを 1 つの結果リストに連結できます。100 個のエントリとバッチ サイズ 10 のリストの場合、必要なのは 10 個の DB クエリ + 並べ替えのための時間だけです。

于 2012-05-30T09:49:49.483 に答える
0

休止状態でできること -

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();
}
于 2012-05-30T10:08:27.810 に答える