2010-07-20 53 views
7

请帮我创建一个包含10“其中”条款和顺序应该是这样的一个选择查询: 结果应该显示在匹配降至至少大部分关键字(有条件的地方)的顺序匹配。排序按最大条件匹配

注:所有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

您能否给您正在使用的查询的例子吗? – 2010-07-20 10:38:45

+0

一些示例模式会很有帮助。 – 2010-07-20 10:38:56

回答

12
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 
+0

这也很好。 – Tobiasopdenbrouw 2010-07-20 10:49:04

+0

看起来不错,我不知道如何用doctrine + symfony做到这一点:D – 2014-06-02 08:44:22

+0

这需要在SQL教科书中。 – 2017-03-08 18:35:39

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; 

我最近回答了堆栈溢出类似的问题,其你可能有兴趣在检查出:

+0

这不会根据匹配数量进行排序。 – 2010-07-20 10:46:16

+0

是的,这是真的。原来的问题并不清楚......我试图看看我能否调整我的答案。 – 2010-07-20 10:47:52

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 
+1

使用Marcelo的解决方案。 – Tobiasopdenbrouw 2010-07-20 10:54:52

0

我不能让这在Oracle上为我工作。 如果使用oracle,那么这个Order by Maximum condition match是一个很好的解决方案。 利用的情况下,当语言功能