我有数十亿条记录的表,表结构如下:
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
这两种情况都应包含在单个SQL查询中,我必须牢记查询的性能。我已经在MY_SEARCH_COLUMN
列上创建了索引,因此欢迎其他建议来提高性能。
答案 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 结束