2013-02-26 32 views
1

我可以知道有什麼解決方案可以在沒有Oracle的訂單的情況下得到結果嗎?這是因爲當我執行如下查詢時,它似乎自動幫助我通過ID字段進行排序。Oracle IN條件沒有排序

SELECT ID FROM USER WHERE ID IN (5004, 5003, 5005, 5002, 5008); 


Actual results   Expected results 
---5002     ---5004 
---5003     ---5003 
---5004     ---5005 
---5005     ---5002 
---5008     ---5008 

萬幸的是,如果你們有這方面的解決方案。

+0

[保留從'IN'子句的順序]的可能的重複(http://stackoverflow.com/questions/14139931/keep-order-from-in-clause) – 2013-02-26 13:59:37

+0

這些問題應該合併:)這裏的一些答案是與那裏不同。 – 2013-02-26 14:58:28

回答

0

如果沒有ORDER BY子句,則無法保證排序順序。

5

這是使用INSTR一種方式,我以前看到:

SELECT * 
FROM YourTable 
WHERE ID IN (5004, 5003, 5005, 5002, 5008) 
ORDER BY INSTR ('5004,5003,5005,5002,5008', id) 

SQL Fiddle Demo

我也看到了使用CASE這樣的:

ORDER BY 
    CASE ID 
    WHEN 5004 THEN 1 
    WHEN 5003 THEN 2 
    WHEN 5005 THEN 3 
    WHEN 5002 THEN 4 
    WHEN 5008 THEN 5 
    END 
5

SELECT聲明返回他們的結果集的行在不可預知的訂單u不用你給ORDER BY條款。

某些數據庫管理系統產品給人錯覺他們的結果集處於可預測的順序。但是,如果你依靠這一點,你一定會感到失望。

1

,如果你想保持順序的列表,你可以做這樣的事情:

SQL> create type user_va as varray(1000) of number; 
    2/

Type created. 

SQL> with users as (select /*+ cardinality(a, 10) */ rownum r, a.column_value user_id 
    2     from table(user_va(11, 0, 19, 5)) a) 
    3 select d.user_id, d.username 
    4 from dba_users d 
    5   inner join users u 
    6     on u.user_id = d.user_id 
    7 order by u.r 
    8/

    USER_ID USERNAME 
---------- ------------------------------ 
     11 OUTLN 
     0 SYS 
     19 DIP 
     5 SYSTEM 

即我們把元素融入一個VARRAY並分配之前合併集的ROWNUM。那麼我們可以通過r來維持我們在列表中的順序。 cardinality提示只是告訴優化器在數組中有多少行(不必死心,只是在球場......沒有這個,它會假設8k行,可能更喜歡對索引方法進行全面掃描)

如果你沒有PRIVS創建一個類型,這只是一些即興的東西,有一些公共的:

select owner, type_name, upper_bound max_elements, length max_size, elem_type_name 
    from all_Coll_types 
where coll_type = 'VARYING ARRAY' 
and elem_type_name in ('INTEGER', 'NUMBER'); 
0

如果你的問題是關於爲什麼排序發生那麼答案是:您在列ID上定義了索引或主鍵嗎?如果是,數據庫將通過索引掃描來響應您的查詢。即:它在IN子句中查找ID而不是在表本身中,但是在ID列中定義的索引中。在索引內,這些值是有序的。

要獲得有關查詢執行的更多信息,請嘗試Oracle的解釋計劃功能。

要以某種順序獲取值,您必須添加ORDER BY子句。這樣做的一個方法是

select ID 
     from USER 
    where ID in (5004, 5003, 5005, 5002, 5008) 
    order by 
      case ID 
      when 5004 then 1 
      when 5003 then 2 
      ... 
      end; 

一個更普遍的方法是將一個排序列添加到您的表:

select ID 
     from USER 
    where ID in (5004, 5003, 5005, 5002, 5008) 
    order by 
      ORDERING; 
0

另一種解決方案,我發現在這裏。

select ID 
    from USER 
where ID in (5004, 5003, 5005, 5002, 5008) 
    order by decode(ID, 5002, 1, 5003, 2, 5004, 3, 5005, 4, 5008, 5); 

順序由解碼(列名,價值,位置)

*注:只需要重複的價值與地位

而且呀,感謝所有的響應!我真的很感激它。