SQL查询:如果满足搜索条件,应返回单条记录,否则返回多条记录

时间:2018-08-03 05:46:51

标签: sql oracle sql-tuning

我有数十亿条记录的表,表结构如下:

ID NUMBER PRIMARY KEY,
MY_SEARCH_COLUMN NUMBER,

MY_SEARCH_COLUMN的数字值长度最多为15位数字。

我想要的是,如果有任何特定的记录匹配,我将只需要获取该匹配的值,

即:如果我输入WHERE MY_SEARCH_COLUMN = 123454321并且表的值为123454321,则仅应返回该值。

但是如果精确值不匹配,我将不得不从表中获取下10个值。

即:如果我输入WHERE MY_SEARCH_COLUMN = 123454321并且列的值不为123454321,那么它应该从表中返回大于123454321

的10个值

这两种情况都应包含在单个SQL查询中,我必须牢记查询的性能。我已经在MY_SEARCH_COLUMN列上创建了索引,因此欢迎其他建议来提高性能。

2 个答案:

答案 0 :(得分:5)

在不使用proc或某些动态SQL的情况下,这样做可能很棘手,但是我们可以在此处尝试使用ROW_NUMBER

WITH cte AS (
    SELECT ID, MY_SEARCH_COLUMN,
        ROW_NUMBER() OVER (ORDER BY MY_SEARCH_COLUMN) rn
    FROM yourTable
    WHERE MY_SEARCH_COLUMN >= 123454321
)

SELECT *
FROM cte
WHERE rn <= CASE WHEN EXISTS (SELECT 1 FROM yourTable WHERE MY_SEARCH_COLUMN = 123454321)
                THEN 1
                ELSE 10 END;

上述查询的基本思想是,我们为与目标匹配或更高匹配的所有记录分配一个行号。然后,在完全匹配的情况下,我们使用行号1进行查询,在不匹配的情况下,我们使用行号最多10的查询。

答案 1 :(得分:0)

选择*     从your_table AS src     哪里src.MY_SEARCH_COLUMN =存在时的情况(从your_table AS src2 WITH(NOLOCK)中选择1那里src2.MY_SEARCH_COLUMN = 123456321)                                 然后123456321                                 ELSE src.MY_SEARCH_COLUMN                           结束

相关问题