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

Posted

技术标签:

【中文标题】SQL 查询:如果满足搜索条件,则应返回单条记录,否则返回多条记录【英文标题】:SQL Query : should return Single Record if Search Condition met, otherwise return Multiple Records 【发布时间】:2018-08-03 05:46:50 【问题描述】:

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

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 那么它应该从表中返回 10 个大于 123454321 的值

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

谢谢@Tim,这正是我想要的。但是我仍然面临性能问题,我已经在列上有索引,我们可以做些什么来提高性能? 我没有看到任何其他明显的方法来提高性能。您可以使用我的回答作为起点打开一个新问题。这样,你会得到更多的关注。【参考方案2】:

选择 * FROM your_table AS src WHERE src.MY_SEARCH_COLUMN = 存在时的情况(从 your_table 中选择 1 作为 src2 WITH(NOLOCK) WHERE src2.MY_SEARCH_COLUMN = 123456321) 那么 123456321 ELSE src.MY_SEARCH_COLUMN 结束

【讨论】:

以上是关于SQL 查询:如果满足搜索条件,则应返回单条记录,否则返回多条记录的主要内容,如果未能解决你的问题,请参考以下文章

根据多个筛选条件 - SQL访问排除记录

mybatis学习记录------2

SQL查询where子句如果没有匹配记录则省略

Linq-to-sql 使用 GroupBy 并返回满足条件的记录

如何显示每周发生并满足某些条件的记录总数 SQL

sql 子查询返回的值不止一个怎么解决?