2008-09-16 7 views
2

Ich habe ein Problem mit einer Abfrage, die zur ZeitSQL Query - Verwenden Sie wie Nur wenn keine exakte Übereinstimmung existiert?

LEFT JOIN weblog_data AS pwd 
    ON (pwd.field_id_41 != '' 
    AND pwd.field_id_41 LIKE CONCAT('%', ewd.field_id_32, '%')) 

nutzt aber ich entdecken, dass ich es brauche, dass nur zu verwenden, wenn es keine ersten genaue Übereinstimmung. Was passiert, ist, dass die Abfrage aufgrund der Verwendung von LIKE doppelt eintaucht. Wenn es also zuerst nach einer genauen Übereinstimmung sucht, wird das Problem des doppelten Eintauchens vermieden. Kann mir jemand weitere Hinweise geben?

Antwort

1

Es klingt, als ob Sie die Tabellen aliased als pwd und ewd in Ihrem Snippet zuerst auf einer genauen Übereinstimmung basieren möchten, und wenn das fehlschlägt, dann haben Sie jetzt den gleichen Vergleich.

Versuchen Sie folgendes:

LEFT JOIN weblog_data AS pwd1 ON (pwd.field_id_41 != '' AND pwd.field_id_41 = ewd.field_id_32) 
LEFT JOIN weblog_data AS pwd2 ON (pwd.field_id_41 != '' AND pwd.field_id_41 LIKE CONCAT('%', ewd.field_id_32, '%')) 

Dann in Ihrer SELECT-Klausel, verwenden Sie so etwas wie dieses:

select 
    isnull(pwd1.field, pwd2.field) 

jedoch, wenn Sie mit einem Feld handelt, die in pwd null sein kann, dass wird Probleme verursachen, sollte dies aber funktionieren:

select 
    case pwd1.nonnullfield is null then pwd2.field else pwd1.field end 

Sie müssen auch sicherstellen, eine Gruppe zu machen, wie die Join zu pwd2 fügt immer noch Zeilen zu Ihrer Ergebnismenge hinzu, auch wenn Sie die darin enthaltenen Daten ignorieren.

1

Sie sprechen über Kurzschlussauswertung.

Werfen Sie einen Blick auf diesen Artikel, es könnte Ihnen helfen: http://beingmarkcohen.com/?p=62

+0

Ich verstehe nicht, wie dies erreicht, was ich suche. Aus den Beispielen sieht es so aus, als sei SQL intelligent genug, um bei sinnlosen Abfragen zusätzliche Zyklen zu vermeiden. Das sieht aus wie Wenn A oder B und A ist wahr, dann geht es weiter. Ich brauche es um A zu tun, wenn A scheitert, mach B. –

+0

Sorry Trick, ich lese die Frage ein paar Mal noch einmal durch und erhalte endlich das, dass du das "Gefällt mir" durch ein Exact Match ersetzen wolltest ... – Sam

1

TSQL verwenden, eine genaue Übereinstimmung laufen, überprüfen Sie für num Zeilen == 0, wenn ja, dergleichen laufen, sonst nicht laufen Ähnliches oder fügen Sie die gleichen Ergebnisse unterhalb der genauen Übereinstimmungen hinzu.

0

Ich kann nur daran denken, es in Code zu tun. Suchen Sie nach einer genauen Übereinstimmung, wenn das Ergebnis leer ist, suchen Sie nach einem LIKE. Eine andere Option ist ein WHERE innerhalb dieser Abfrage, so dass WHERE ({count from exact match} = 0), in diesem Fall wird es nicht den Vergleich mit LIKE durchlaufen, wenn die genaue Übereinstimmung mehr als 0 Ergebnisse zurückgibt. Aber es ist furchtbar ineffizient ... ganz zu schweigen von der Tatsache, dass es sinnvoll ist, es sinnvoll im Code zu verwenden.

Ich würde für ein If gehen (zählen von genau übereinstimmung = 0) dann tun, wie Abfrage, sonst verwenden Sie einfach das Ergebnis von genau übereinstimmen.