sql - 查找表中大于某个值的最小值

标签 sql oracle

说我有以下数据

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

想象一下,这些代表盒子的体积。我有一些东西想放在盒子里,我想要尽可能小的盒子。我需要一个 SQL 查询,它将:
  • 返回最小行大于我的查询参数的行
  • 如果没有这样的行,则返回最大的行。

  • 很容易将其拆分为两个查询(即首先查询点 1,如果没有返回行,则从表中选择最大的数)。但是,如果可能的话,我喜欢在一个查询中做一些事情以消除开销(代码和上下文切换),而且看起来应该可以做到。这可能很明显,但是太阳一整天都照在我身上,我无法思考!

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

    我使用的是 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/

    相关文章:

    sql - Perl、DBI 和 SQL : Why NOT does not work in some SQL queries?

    Oracle sql如何获取星期几

    php - 自动格式化sql日期

    oracle - Hibernate/Oracle 'with' 子句/ native SQL

    python - 在单个域上使用两个不同的框架 (Oracle Weblogic/Django)

    mysql - 使用最近输入的值加入

    mysql - 从表中获取按某个值范围分组的 id 计数

    mysql - 计算给定列中具有字符 A、B、C 的条目数

    c# - 使用 oledb 的参数化 oracle 查询

    sql - 在准备好的语句参数中使用表列