2010-07-20 14 views
7

Proszę, pomóż mi utworzyć zapytanie, które zawiera 10 klauzul "gdzie" i kolejność powinna być taka: wyniki powinny być wyświetlane w kolejności większości słów kluczowych (gdzie warunki) dopasowane do najmniejszego dopasowane.Zamówienie według warunku maksymalnego dopasuj

UWAGA: wszystkie 10 warunków ma wartość "LUB".

Proszę, pomóż mi utworzyć to zapytanie. używam MS-SQL Server 2005

odczuwalna:

Select * 
    from employee 
where empid in (1,2,4,332,434) 
    or empname like 'raj%' 
    or city = 'jodhpur' 
    or salary >5000 

W powyższym zapytaniu te wszystkie rekord, który pasuje do maksymalnych warunków powinien być na górze i mniej pasującego rekordu warunek powinien być na dole.

+0

Czy możesz podać przykład zapytania, którego używasz? –

+0

Schemat przykładowy byłby pomocny. –

Odpowiedz

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

To również działa ładnie. – Tobiasopdenbrouw

+0

wygląda świetnie, nie mam pojęcia, jak to zrobić z doktryną + symfony: D –

+0

To musi być w podręcznikach SQL. –

2

EDYCJA: Ta odpowiedź została opublikowana przed zmodyfikowaniem pytania konkretnym przykładem. Marcelo's solution rozwiązuje problem. Z drugiej strony, moja odpowiedź dawała pierwszeństwo dopasowaniu konkretnych pól.


Możesz spróbować coś jak poniżej, przy użyciu tych samych wyrażeń w klauzuli ORDER BY jak w klauzuli 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; 

I niedawno odpowiedział na podobne pytanie na przepełnienie stosu, który może być zainteresowany w sprawdzeniu:

+0

Ta kolejność nie jest zgodna z liczbą dopasowań. –

+0

Tak, to prawda. W pierwotnym pytaniu nie było to jasne ... Próbuję sprawdzić, czy mogę dostosować moją odpowiedź. –

0

Istnieje wiele opcji/odpowiedzi możliwych. Najlepsza odpowiedź zależy od rozmiaru danych, wymagań niefunkcjonalnych, itd

Powiedział, że to, co robię, jest coś takiego (czytelny/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 
+1

Użyj rozwiązania Marcelo. – Tobiasopdenbrouw

0

nie mogłem to działa dla mnie na Oracle. Jeśli używasz wyroczni, to ta Order by Maximum condition match jest dobrym rozwiązaniem. Wykorzystuje przypadek, gdy funkcja języka

Powiązane problemy