查找表中的最大值大于某个值

Gre*_*lds 6 sql oracle

说我有以下数据

Name      Value
===============
Small        10
Medium      100
Large      1000
Run Code Online (Sandbox Code Playgroud)

想象一下,这些代表了盒子的数量.我想把一些物品放在盒子里,我想要最小的盒子.我需要一个SQL查询,它将:

  1. 返回最小行大于查询参数的行
  2. 如果没有这样的行,则返回最大的行.

很容易将其拆分为两个查询(即首先查询点1,如果没有返回行,则从表中选择最大数字).但是,如果可能的话,我喜欢在一个查询中执行操作以消除开销(代码和上下文切换),并且看起来应该可以这样做.这可能非常明显,但太阳一直照着我,我想不到!

因此,例如,如果您使用参数5,则我希望查询返回10,如果使用参数15,则我希望返回100,如果使用大于100的任何值(包括大于1000的数字),则希望返回1000.

我使用的是Oracle 11g,所以任何特殊的Oracle优点都可以.

Qua*_*noi 2

SELECT  *
FROM    (
        SELECT  *
        FROM    (
                SELECT  *
                FROM    mytable
                WHERE   value > 10000
                ORDER BY
                        value
                )
        UNION ALL
        SELECT  *
        FROM    (
                SELECT  *
                FROM    mytable
                ORDER BY
                        value DESC
                )
        )
WHERE   rownum = 1
Run Code Online (Sandbox Code Playgroud)

mytable(value)这将有效地使用和上的索引COUNT(STOPKEY)

有关性能详细信息,请参阅我的博客中的这篇文章: