6

这是我需要做的。

我在java中有一个列表,我可以将其转换为逗号分隔的ID字符串,例如“3,4,5,6,1,2”

我想知道是否有办法将该字符串传递给oracle并根据该字符串的排序顺序对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 子句中放置一个解码。每个解码中的第二个参数是列表的一个元素。

于 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 * from t_test t where t.id = ?并为列表中的每个 ID 运行此语句并将结果添加到结果列表中。

您也可以尝试使用参数为 ID 列表的存储过程来执行此操作

编辑

另一个想法是在你的 ID 列表的小块上使用 IN 运算符(每个可能有 10 个)。由于这将以未指定的顺序返回结果,因此您可以编写一个自定义比较器或另一个类,将该列表带入您指定的顺序。然后,您可以将所有子列表连接到一个结果列表中。对于包含 100 个条目和批量大小为 10 的列表,您只需要 10 个数据库查询 + 一些时间进行重新排序

于 2012-05-30T09:49:49.483 回答
0
select t1 from (select t.id t1 from t_test t order by t.id asc);
于 2012-05-30T09:52:58.693 回答
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 回答