说我有以下数据

Name      Value
===============
Small        10
Medium      100
Large      1000

想象一下,这些代表盒子的体积。我有一些要放入包装盒中的物品,并且希望有最小的包装盒。我需要一个SQL查询,该查询将:
  • 返回最小行大于我的查询参数
  • 的行
  • 如果没有这样的行,则返回最大的行。

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

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

    我使用的是Oracle 11g,因此任何特殊的Oracle优点都可以。

    最佳答案

    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
    

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

    有关性能的详细信息,请参见我的博客中的这篇文章:
  • Selecting lowest value
  • 关于sql - 在表中找到大于某个特定值的最小值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/769069/

    10-11 10:32