【发布时间】:2012-06-04 12:57:00
【问题描述】:
这是我需要做的。
我在 java 中有一个列表,我可以将其转换为逗号分隔的 ID 字符串,例如“3,4,5,6,1,2”
我想知道是否有办法将该字符串传递给 oracle 并根据该字符串的排序顺序对 sql 代码进行排序?
所以这个查询:
select t.id
from t_test t
将导致此订单
ID
3
4
5
6
1
2
【问题讨论】:
这是我需要做的。
我在 java 中有一个列表,我可以将其转换为逗号分隔的 ID 字符串,例如“3,4,5,6,1,2”
我想知道是否有办法将该字符串传递给 oracle 并根据该字符串的排序顺序对 sql 代码进行排序?
所以这个查询:
select t.id
from t_test t
将导致此订单
ID
3
4
5
6
1
2
【问题讨论】:
我认为这是不可能的。您只能在查询中使用升序或降序。但是您可以做的是使用像 select * from t_test t where t.id = ? 这样的准备好的语句,并为列表中的每个 ID 运行此语句,并将结果添加到结果列表中。
您也可以尝试使用参数为 ID 列表的存储过程来执行此操作
编辑
另一个想法是在您的 ID 列表的一小部分(每个可能 10 个)上使用 IN 运算符。由于这将以未指定的顺序返回结果,您可以编写一个自定义比较器或另一个类,将该列表带入您指定的顺序。然后,您可以将所有子列表连接到一个结果列表中。对于包含 100 个条目和批量大小为 10 的列表,您只需要 10 个数据库查询 + 一些时间进行重新排序
【讨论】:
select t1 from (select t.id t1 from t_test t order by t.id asc);
【讨论】:
在休眠中你可以做 -
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();
}
【讨论】:
如果你可以在 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 子句中对列表中的每个元素进行解码。每个解码中的第二个参数是列表的一个元素。
【讨论】:
ORDER BY column1 ASC, column2 DESC, ...基本相同。如果 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 的参数,但我尚未对此进行测试。
【讨论】: