oracle中的IN子句保证顺序

时间:2018-03-13 05:08:16

标签: sql oracle11g

我有SQL:

select name, city, age 
from Student where (name, city) 
in (('Tom1','CiTy1'),('Tom2','CiTy2'),...,('TomN','CiTyN'))

SQL保证顺序的结果?

例如:

Name ----- City  ----- Age
Tom1   |   CiTy1   |   10
Tom2   |   CiTy1   |   17
Tom3   |   CiTy1   |   15
..............
TomN   |   CiTyN   |   09

3 个答案:

答案 0 :(得分:1)

您不能简单地使用以下排序,因为文本编号无法正确排序(最有可能):

ORDER BY city, name

但我们可以删除文本组件,转换为int,然后排序:

SELECT
    name, city, age
FROM Student
WHERE (name, city) In (('Tom1','CiTy1'), ('Tom2','CiTy2'),...,('TomN','CiTyN'))
ORDER BY
    CAST(REPLACE(city, 'CiTy') AS INT),
    CAST(REPLACE(name, 'Tom') AS INT)

答案 1 :(得分:1)

正如其他人所说,您需要添加order by子句以保证订购。

如果您希望您的in子句确定顺序,您可以执行以下操作:

List of 8
 $ list1.a      : num 1
 $ list1.b      : num 2
 $ list1.blist.a: num 3
 $ list1.blist.b: num 4
 $ list2.a      : num 1
 $ list2.b      : num 2
 $ list2.blist.a: num 3
 $ list2.blist.b: num 4

答案 2 :(得分:0)

获取排序结果的唯一方式是使用ORDER BY

您可以使用正则表达式删除任何非数字字符,将该字符串转换为数字,然后按该数字排序:

select name, city, age
from student
where ..
order by to_number(regexp_replace(name, '[^0-9]', '')), 
         to_number(regexp_replace(city, '[^0-9]', ''))