2012-05-30 15 views

risposta

9

Se è possibile modificare la query in java , si potrebbe fare qualcosa di simile:

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; 

devi mettere una decodifica nell'ordine dalla clausola per ogni elemento della lista. Il secondo parametro in ogni decodifica è un elemento della lista.

+0

Sì, ho appena notato la stessa cosa e sembra che funzioni! – goe

+0

Questo sembra buono. Ma questo significa che l'ordine di viene applicato per il numero di volte in cui viene usato decode()? – Yash

+1

@Yash la clausola order by viene applicata una sola volta. Questo è fondamentalmente uguale a 'ORDER BY column1 ASC, column2 DESC, ...'. Se la clausola order by viene applicata più volte, l'ultima volta sostituisce le precedenti. – Pablo

0

Non credo che sia possibile. È possibile utilizzare solo l'ordine crescente o decrescente nelle query. Ma quello che puoi fare è usare una dichiarazione preparata come questa select * from t_test t where t.id = ? ed eseguirla per ciascun ID nel tuo elenco e aggiungere il risultato a un elenco di risultati.

Si potrebbe anche provare a fare questo con una stored procedure il cui parametro sarebbe l'elenco di ID

EDIT

Un'altra idea è quella di utilizzare IN operatore piccoli pezzi del vostro ID-list (forse 10 in ciascuno). Poiché ciò restituirà risultati in un ordine non specificato, potresti scrivere un comparatore personalizzato o un'altra classe che porta questo elenco nell'ordine specificato. Quindi è possibile concatenare tutte le sotto-liste in un'unica lista di risultati. Per una lista con 100 voci e dei lotti di dimensione 10 si avrebbe solo bisogno di 10 interrogazioni al database DB + po 'di tempo per riordinare

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

L'ordine deve provenire da Java ... – goe

+0

quale tecnologia stai utilizzando per l'accesso al database? –

0

In ibernazione u può fare -

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

Qualcosa di simile a questo:

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; 

Probabilmente può fare la letterale '3,4,5,6,1,2' un parametro per un PreparedStatement, ma non ho ancora testato questo.

Problemi correlati