2012-05-30 4 views
6

Hier ist, was ich tun muss.Wie oracle zu sortieren nach einer bestimmten Sortierreihenfolge von Java übergeben?

Ich habe eine Liste in Java, die ich durch Komma getrennte Zeichenfolge von IDs wie so „3,4,5,6,1,2“ umwandeln kann

Ich frage mich, ob es Art und Weise, dass die Zeichenfolge Orakel passieren und haben sql code sort basierend auf der Sortierreihenfolge dieser Zeichenfolge?

Also diese Abfrage:

select t.id 
from t_test t 

in dieser Reihenfolge führen würde

ID 
3 
4 
5 
6 
1 
2 

Antwort

9

Wenn Sie die Abfrage in Java ändern , könnten Sie so etwas tun:

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; 

Sie haben für jedes Element in der Liste eine Dekodierungs in der Reihenfolge von Klausel zu setzen. Der zweite Parameter in jeder Dekodierung ist ein Element der Liste.

+0

Ja, ich habe gerade das Gleiche bemerkt und es scheint zu funktionieren! – goe

+0

Das sieht gut aus. Aber heißt das, dass order by für die Anzahl der Male verwendet wird, für die decode() verwendet wird? – Yash

+1

@Yash die Order by-Klausel wird nur einmal angewendet. Dies ist im Grunde dasselbe wie 'ORDER BY Spalte1 ASC, Spalte2 DESC, ...'. Wenn die Order by-Klausel mehrfach angewendet wird, überschreibt das letzte Mal die vorherigen. – Pablo

0

Ich glaube nicht, es ist möglich. Sie können nur in aufsteigender oder absteigender Reihenfolge in Abfragen verwenden. Aber Sie können eine vorbereitete Anweisung wie diese select * from t_test t where t.id = ? verwenden und diese für jede ID in Ihrer Liste ausführen und das Ergebnis zu einer Ergebnisliste hinzufügen.

Sie könnten auch versuchen, diese mit einer gespeicherten Prozedur zu tun, deren Parameter wäre die Liste der IDs

EDIT

Eine weitere Idee IN-Operator auf kleine Stücke Ihrer ID-Liste zu verwenden ist (vielleicht 10 in jedem). Da dies Ergebnisse in nicht angegebener Reihenfolge zurückgibt, könnten Sie einen benutzerdefinierten Vergleicher oder eine andere Klasse schreiben, die diese Liste in Ihre angegebene Reihenfolge bringt. Dann können Sie alle Unterlisten zu einer Ergebnisliste verketten. Eine Liste mit 100 Einträgen und Chargengröße 10 würden Sie brauchen nur 10 DB Anfragen + einige Zeit für

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

Die Bestellung muss von Java kommen ... – goe

+0

Welche Technologie verwenden Sie für den Datenbankzugriff? –

0

In Hibernate Neuordnungs u tun können -

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

Etwas wie folgt aus:

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; 

Sie können sich wahrscheinlich die wörtliche '3,4,5,6,1,2' einen Parameter für eine PreparedStatement machen, aber ich habe das nicht getestet.

Verwandte Themen