1

我可以知道是否有任何解决方案可以在不订购 Oracle 的情况下获得结果?这是因为当我按如下方式执行查询时,它似乎会自动帮助我按 ID 字段对其进行排序。

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

如果你们对此有解决方案,谢谢。

4

6 回答 6

5

这是我过去使用过的一种方式INSTR

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

SQL 小提琴演示

我也见过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 
于 2013-02-26T13:38:10.850 回答
5

SELECT除非您给出子句,否则语句会以不可预知的顺序返回其结果集中的行。ORDER BY

某些 DBMS 产品给人一种错觉,即它们的结果集是按可预测的顺序排列的。但如果你依赖它,你一定会失望的。

于 2013-02-26T13:39:45.533 回答
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

即我们将元素放入一个可变数组并在合并集合之前分配一个rownum。然后我们可以通过它r来维护我们的列表的顺序。提示只是告诉优化器cardinality数组中有多少行(不必死在,只是在球场上..因为没有这个,它将假设 8k 行并且可能更喜欢完全扫描而不是索引方法)

如果您没有权限来创建类型,而这只是一些临时的事情,那么有一些公共的:

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');
于 2013-02-26T13:45:00.043 回答
0

如果没有 ORDER BY 子句,则无法保证排序顺序。

于 2013-02-26T13:37:54.377 回答
0

如果您的问题是关于为什么会发生排序,那么答案是:您是否在列 ID 上定义了索引或主键?如果是,则数据库通过索引扫描响应您的查询。也就是说:它不是在表本身中而是在 ID 列上定义的索引中查找 IN 子句中的 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;

更通用的方法是在表中添加一个 ORDERING 列:

    select ID 
      from USER 
     where ID in (5004, 5003, 5005, 5002, 5008)
     order by
           ORDERING;
于 2013-02-26T16:01:10.380 回答
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);

按解码排序(列名、值、位置)

*注:只需重复 VALUE 和 POSITION

是的,感谢所有回复!我真的很感激。

于 2013-03-05T02:18:05.727 回答