Как сказать oracle Сортировать по определенному порядку сортировки, переданному с java?

вот что мне нужно уметь делать.

у меня есть список на java, который я могу преобразовать в запятую отдельную строку идентификаторов, например "3,4,5,6,1,2"

интересно, есть ли способ передать эту строку в oracle и отсортировать код sql на основе порядка сортировки этой строки?

Так этот запрос:

select t.id
from t_test t

приведет к такому порядку

ID
3
4
5
6
1
2

5 ответов


Если вы можете изменить запрос на 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 для каждого элемента в списке. Вторым параметром в каждом декодировании является один элемент списка.


что-то вроде этого:

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, но я его не тестировал.


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

Я не думаю, что это возможно. В запросах можно использовать только восходящий или нисходящий порядок. Но что вы можете сделать, это использовать подготовленное заявление, как это select * from t_test t where t.id = ? и запустите это для каждого идентификатора в вашем списке и добавьте результат в список результатов.

вы также можете попробовать сделать это с помощью хранимой процедуры, параметром которой будет список идентификаторов

редактировать

другая идея-использовать оператор на небольших кусках вашего ID-списка (возможно, по 10 в каждом). Поскольку это вернет результаты в неопределенном порядке, вы можете написать пользовательский компаратор или другой класс, который приведет этот список в указанный вами порядок. Затем вы можете объединить все вложенные списки в один список результатов. Для списка со 100 записями и размером пакета 10 вам понадобится только 10 запросов DB + некоторое время для переупорядочивания


в спящем режиме 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();
}