如果我有一张人的桌子,那么这个年龄的人就是这样的。列,我想查询它我能做到
SELECT * FROM people WHERE age = 30
如果我想限制它,我可以放入TOP
。
SELECT TOP 100 * FROM people WHERE age = 30
但是作为我想要的一个例子,我想知道,如果我能得到30岁的所有人,如果少于100个,那么得到25岁的人,如果仍然少于100个,那么所有名字都是' jeff'。
通常我会这样做(伪码警告):
SELECT TOP 100 * FROM people WHERE age = 30
if results < 100
SELECT TOP (100 - previousResultCount) * FROM people WHERE age = 25
if results < 100
SELECT TOP (100 - previousResultCounts) * FROM people WHERE name = 'jeff'
我想知道如何执行这种查询,并且如果可以在结果中包括附加值,表明结果来自它已经移动到下一个阶段,例如。以上可能是:
STEVE 30 1
STACY 30 1
SALLY 25 2
SUSAN 25 2
JEFF 19 3
以上是一个简单的例子。我实际上在做的是全文搜索查询,例如。向我显示name = query
,name contains query
,name contains all words in query but in a different order
等的结果,我想将它们全部合并到一个查询中,因为我认为这会更快,特别是如果我添加额外的WHERE年龄= 30的条款。
我总是希望获得100个结果,并且必须对它们进行排名,以便首先显示完美匹配。如果数据混乱并且我通过查询将上述内容作为一个,那么在OR或OR中我必须将上面的第3列添加到ORDER BY并与TOP一起使用。
我担心的是,如果我做OR OR,以某种方式包括排名然后按该排名排序并选择顶部它将进行大量不必要的计算,例如它可能必须计算每一行获取排名的数据库,以便将它们整理好,我想避免这种情况。
这有意义吗?
答案 0 :(得分:3)
SELECT TOP 100 * FROM people where age in (30,25) or name = 'jeff'
order by age desc
答案 1 :(得分:0)
您必须引入一个计算列来帮助您进行排序:
SELECT TOP 100 *
,CASE
WHEN age = 30 THEN 1
WHEN age = 25 THEN 2
WHEN name='jeff' THEN 3
ELSE 4
END stage
FROM people
ORDER BY stage ASC