2012-05-30 35 views
6

Đây là những gì tôi cần để có thể làm.Làm thế nào để nói oracle để sắp xếp theo một thứ tự sắp xếp cụ thể thông qua từ java?

tôi có một danh sách trong java mà tôi có thể chuyển đổi sang dấu phẩy chuỗi riêng biệt của các ID như vậy "3,4,5,6,1,2"

Tôi tự hỏi nếu có cách để vượt qua mà chuỗi oracle và có phân loại mã sql dựa trên thứ tự sắp xếp của chuỗi đó?

Vì vậy, truy vấn này:

select t.id 
from t_test t 

sẽ cho kết quả theo thứ tự này

ID 
3 
4 
5 
6 
1 
2 

Trả lời

9

Nếu bạn có thể sửa đổi các truy vấn trong java , bạn có thể làm điều gì đó như sau:

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; 

Bạn phải đặt giải mã theo thứ tự theo mệnh đề cho từng phần tử trong danh sách. Tham số thứ hai trong mỗi giải mã là một phần tử của danh sách.

+0

Vâng, tôi chỉ nhận thấy điều tương tự và có vẻ như nó đang hoạt động! – goe

+0

Điều này có vẻ tốt. Nhưng điều này có nghĩa là thứ tự bằng được áp dụng cho số lần mà decode() được sử dụng? – Yash

+1

@Yash đơn đặt hàng theo mệnh đề chỉ được áp dụng một lần. Điều này về cơ bản giống với 'ORDER BY column1 ASC, column2 DESC, ...'. Nếu thứ tự theo mệnh đề được áp dụng nhiều lần, lần cuối cùng sẽ ghi đè lên các giá trị trước đó. – Pablo

0

Tôi không nghĩ rằng nó có thể. Bạn chỉ có thể sử dụng thứ tự tăng dần hoặc giảm dần trong các truy vấn. Nhưng những gì bạn có thể làm là sử dụng một tuyên bố chuẩn bị như thế này select * from t_test t where t.id = ? và chạy điều này cho mỗi ID trong danh sách của bạn và thêm kết quả vào danh sách kết quả.

Bạn cũng có thể cố gắng làm điều này với một stored procedure có tham số sẽ là danh sách các ID

EDIT

ý tưởng khác là sử dụng TRÊN điều hành trên khối nhỏ của ID-list của bạn (có thể 10 trong mỗi cái). Vì điều này sẽ trả về kết quả theo thứ tự không xác định, bạn có thể viết một trình so sánh tùy chỉnh hoặc một lớp khác đưa danh sách này vào thứ tự được chỉ định của bạn. Sau đó, bạn có thể nối tất cả các danh sách con vào một danh sách kết quả. Đối với một danh sách với 100 mục và kích thước 10 batch bạn sẽ chỉ cần 10 DB truy vấn + một chút thời gian để sắp xếp lại

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

Đơn đặt hàng phải đến từ java ... – goe

+0

bạn đang sử dụng công nghệ nào để truy cập cơ sở dữ liệu? –

0

trong Hibernate u có thể làm -

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

Something như thế này:

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; 

Bạn có lẽ có thể làm cho đen '3,4,5,6,1,2' một tham số cho một PreparedStatement nhưng tôi đã không kiểm tra đó.

Các vấn đề liên quan