2012-05-30 13 views

Respuesta

9

Si se puede modificar la consulta en Java , se podría hacer algo como esto:

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; 

usted tiene que poner una decodificación en la cláusula ORDER BY para cada elemento de la lista. El segundo parámetro en cada decodificación es un elemento de la lista.

+0

Sí, acabo de notar lo mismo y parece estar funcionando! – goe

+0

Esto se ve bien. Pero, ¿significa esto que se aplica el orden por la cantidad de veces que se usa decode()? – Yash

+1

@Yash la cláusula order by solo se aplica una vez. Esto es básicamente lo mismo que 'ORDER BY column1 ASC, column2 DESC, ...'. Si la cláusula order by se aplica varias veces, la última vez anularía las anteriores. – Pablo

0

No creo que sea posible. Solo puede usar el orden ascendente o descendente en las consultas. Pero lo que puede hacer es usar una declaración preparada como esta select * from t_test t where t.id = ? y ejecutar esto para cada ID en su lista y agregar el resultado a una lista de resultados.

También puede tratar de hacer esto con un procedimiento almacenado cuyo parámetro sería la lista de ID

EDIT

Otra idea es utilizar en el operador de pequeños trozos de su ID de lista (tal vez 10 en cada uno). Como esto arrojará resultados en un orden no especificado, podría escribir un comparador personalizado u otra clase que lleve esta lista a su orden especificado. Luego puede concatenar todas las listas secundarias en una lista de resultados. Para obtener una lista con 100 entradas y tamaño 10 lotes sólo necesitaría 10 consultas DB + algo de tiempo para reordenar

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

El pedido debe provenir de java ... – goe

+0

¿Qué tecnología está utilizando para acceder a la base de datos? –

0

en Hibernate u puede hacer -

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

Algo como esto:

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; 

probablemente usted puede hacer que el literal '3,4,5,6,1,2' un parámetro para un PreparedStatement, pero no he probado eso.

Cuestiones relacionadas