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 查询:如果满足搜索条件,则应返回单条记录,否则返回多条记录的主要内容,如果未能解决你的问题,请参考以下文章