如何告诉oracle按照从java传入的特定排序顺序进行排序?

这就是我需要做的事情。

我在java中有一个List,我可以将其转换为逗号单独的ID字符串,如此“3,4,5,6,1,2”

我想知道是否有办法将该字符串传递给oracle并根据该字符串的排序顺序进行sql代码排序?

所以这个查询:

select t.id from t_test t 

会导致这个订单

 ID 3 4 5 6 1 2 

如果你可以在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运行此命令,并将结果添加到结果列表中。

您还可以尝试使用存储过程执行此操作,该存储过程的参数将是ID列表

编辑

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

在冬眠你可以做 –

 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(); }