请帮我创建一个包含10'where'子句的选择查询,顺序应该是这样的: 结果应按大多数关键字(条件)匹配至最不匹配的顺序显示。
注意:所有10个条件都带有“OR”。
请帮我创建此查询。 我正在使用ms-sql server 2005
像:
Select *
from employee
where empid in (1,2,4,332,434)
or empname like 'raj%'
or city = 'jodhpur'
or salary >5000
在上面的查询中,所有匹配最大条件的记录应该在顶部,而不匹配的条件记录应该在底部。
答案 0 :(得分:13)
SELECT *
FROM (SELECT (CASE WHEN cond1 THEN 1 ELSE 0 END +
CASE WHEN cond2 THEN 1 ELSE 0 END +
CASE WHEN cond2 THEN 1 ELSE 0 END +
...
CASE WHEN cond10 THEN 1 ELSE 0 END
) AS numMatches,
other_columns...
FROM mytable
) xxx
WHERE numMatches > 0
ORDER BY numMatches DESC
答案 1 :(得分:2)
编辑:在使用具体示例修改问题之前发布了此答案。 Marcelo's solution解决了实际问题。另一方面,我的回答是优先考虑特定领域的匹配。
您可能希望使用与ORDER BY
子句中WHERE
子句中相同的表达式尝试类似下面的内容:
SELECT *
FROM your_table
WHERE field_1 = 100 OR
field_2 = 200 OR
field_3 = 300
ORDER BY field_1 = 100 DESC,
field_2 = 200 DESC,
field_3 = 300 DESC;
我最近在Stack Overflow上回答了一个类似的问题,您可能有兴趣查看:
答案 2 :(得分:0)
有很多选项/答案可能。最佳答案取决于数据的大小,非功能性要求等。
那就是说,我会做的就是这样(易于阅读/调试):
Select * from
(Select *, iif(condition1 = bla, 1, 0) as match1, ..... , match1+match2...+match10 as totalmatchscore from sourcetable
where
condition1 = bla or
condition2 = bla2
....) as helperquery
order by helperquery.totalmatchscore desc
答案 3 :(得分:0)
我无法让这个在Oracle上为我工作。 如果使用oracle,那么这个Order by Maximum condition match是一个很好的解决方案。 利用语言特征
的情况