So wie Ihre Abfrage derzeit geschrieben ist, liefert die WHERE-Klausel keine Informationen, die zum Sortieren der Ergebnisse verwendet werden können. Ich mag Brians Idee ; fügen Sie eine konstante Spalte hinzu und UNION die Abfragen und Sie könnten sogar alles in einer Ergebnismenge erhalten. Zum Beispiel:
SELECT 1 as rank, * FROM Items WHERE column LIKE '%foo%' AND column LIKE '%bar%'
UNION
SELECT 2 as rank, * FROM Items WHERE column LIKE '%foo%' AND column NOT LIKE '%bar%'
UNION
SELECT 2 as rank, * FROM Items WHERE column LIKE '%bar%' AND column NOT LIKE '%foo%'
ORDER BY rank
Dies würde jedoch nur zu folgendem Ergebnis führen:
- Die ungeordnete Menge aller Zeilen, die mit foo und bar übereinstimmen
- gefolgt von (der ungeordneten Menge von) allen Zeilen, die mit foo oder bar übereinstimmen, aber nicht mit beiden (obwohl Sie diese in zwei separate Gruppen aufteilen könnten, indem Sie eine andere Konstante in der letzten SELECT-Anweisung verwenden).
Das könnte genau das sein, wonach Sie suchen, aber es würde Ihnen nicht sagen, welche Zeilen dreimal mit foo übereinstimmen, oder sie vor den Zeilen sortieren, die nur eine Instanz von foo enthalten. Außerdem können all diese LIKEs teuer werden. Wenn Sie die Ergebnisse wirklich nach Relevanz sortieren wollen (wie auch immer Sie das definieren), sollten Sie vielleicht besser einen Volltextindex verwenden. Wenn Sie MS SQL Server verwenden, verfügt dieser über einen eingebauten Dienst, der dies ermöglicht, und es gibt auch Produkte von Drittanbietern, die dasselbe tun.
EDIT: Nachdem ich mir alle anderen Antworten angesehen habe (es waren nur zwei als ich mit meiner angefangen habe - ich muss offensichtlich lernen, schneller zu denken ;-) ), ist es offensichtlich, dass es mehrere Möglichkeiten gibt, dies zu tun, je nachdem, was genau Sie erreichen wollen. Ich würde Ihnen raten, Lösungen zu testen und zu vergleichen, je nachdem, wie sie funktionieren in Ihrem System . Ich bin kein Leistungs-/Tuning-Experte, aber Funktionen neigen dazu, die Dinge zu verlangsamen, vor allem, wenn man nach dem Ergebnis einer Funktion sortiert. Der LIKE-Operator ist auch nicht unbedingt flink. Als Entwickler scheint es natürlich zu sein, vertraute Konstrukte wie "IF" und "CASE" zu verwenden, aber Abfragen, die eher einen mengenbasierten Ansatz verwenden, haben normalerweise eine bessere Leistung in einem RDMS. Auch hier gilt: YMMV, also testen Sie am besten, wenn Sie sich um die Leistung sorgen.