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

SQL Query : should return Single Record if Search Condition met, otherwise return Multiple Records

我有 table 十亿条记录,Table 结构如下:

ID NUMBER PRIMARY KEY,
MY_SEARCH_COLUMN NUMBER,

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

我想要的是,如果任何特定的记录匹配,我将只需要得到那个匹配的值,

即: 如果我输入 WHERE MY_SEARCH_COLUMN = 123454321 并且 table 的值为 123454321 那么这应该只被 returned.

但是如果不匹配确切的值,我将不得不从 table.

中获取接下来的 10 个值

即:如果我输入 WHERE MY_SEARCH_COLUMN = 123454321 并且列没有值 123454321 那么它应该 return 来自 table 的 10 个值大于 123454321

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

如果不使用 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 的所有行号进行查询。

SELECT * 从 your_table 作为源 WHERE src.MY_SEARCH_COLUMN = CASE WHEN EXISTS (SELECT 1 FROM your_table AS src2 WITH(NOLOCK) WHERE src2.MY_SEARCH_COLUMN = 123456321) 然后 123456321 其他 src.MY_SEARCH_COLUMN 结束