Order by Maximum condition match

前端 未结 4 555
名媛妹妹
名媛妹妹 2020-12-16 22:09

Please help me to create a select query which contains 10 \'where\' clause and the order should be like that: the results should be displayed in order of most keywords(where

相关标签:
4条回答
  • 2020-12-16 22:39
    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 讨论(0)
  • 2020-12-16 22:53

    EDIT: This answer was posted before the question was modified with a concrete example. Marcelo's solution addresses the actual problem. On the other hand, my answer was giving priority to matches of specific fields.


    You may want to try something like the following, using the same expressions in the ORDER BY clause as in your WHERE clause:

    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;
    

    I've recently answered a similar question on Stack Overflow which you might be interested in checking out:

    • Is there a SQL technique for ordering by matching multiple criteria?
    0 讨论(0)
  • 2020-12-16 23:02

    There are many options/answers possible. Best answer depends on size of the data, non-functional requirements, etc.

    That said, what I would do is something like this (easy to read / debug):

      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
    
    0 讨论(0)
  • 2020-12-16 23:03

    I could not get this to work for me on Oracle. If using oracle, then this Order by Maximum condition match is a good solution. Utilizes the case when language feature

    0 讨论(0)
提交回复
热议问题