IN的Oracle DB顺序

时间:2014-04-15 20:37:38

标签: sql oracle

这个问题适用于Oracle DB。

我有一组作为主键的值,并希望获得这些主键的其他对应值。以下查询适用于此:

SELECT value1, value2, value3 
FROM mytable 
WHERE value1 IN ( 13548, 65435, 56455 )

但是,该查询以不同的顺序返回行,我希望查询以IN括号中列出的顺序返回它们。是否可以使用Oracle DB进行此操作?

3 个答案:

答案 0 :(得分:2)

这将是一个繁琐的order by,但你可以做这样的事情:

order by case value1 when 13458 then 1 when 65435 then 2 when 56455 then 3 end

答案 1 :(得分:2)

有一种方法可以做到:

with id_list (id, sort_order) as 
(
  select 13548, 1 from dual
  union all
  select 65435, 2 from dual
  union all 
  select 56455, 3 from dual
)
SELECT value1, value2, value3 
FROM mytable 
  JOIN id_list ON id_list.id = mytable.value1
ORDER BY id_list.sort_order

Oracle缺少values行构造函数使得写入有点难看,但它基本上可以满足您的需求。添加新值时,您无需更改order by

答案 2 :(得分:1)

您需要一个order by子句。

如果您只是按value1排序,那么结果将按数字顺序排列,13548,56455,65435。

如果您希望以定义的非数字顺序返回列,则可以伪造order by子句。

ORDER BY CASE WHEN VALUE1 = 65435 THEN 20000 ELSE VALUE1 END

这使得65k只在订购时看起来像20k,因此它最终将介于其他两个值之间。您可以添加其他when语句来更改更多值的顺序。

in子句没有默认的排序方式。