SQL-Bedingung, String vergleichen in der Where-Klausel
Mithilfe von SQL Server, ich habe eine gespeicherte Prozedur, die ich verwenden möchte, um eine string-Suche ist optional.
@search
ist ein parameter. Wenn @search
einen Wert hat, möchte ich die Suche nach der Zeichenfolge, ansonsten, wenn es leer ist, sollte es umgehen die Suche.
Ich wollte nur wissen, Ihre Gedanken über die optimale Art und Weise zu schreiben einen optionalen string-Suche in einer WO.
Nun habe ich es als
AND (@search = '' OR [t4].number like '%'+@search+'%')
Aber was ich nicht in der Lage, um herauszufinden, ist, wenn die wie wertet auch wenn @search = ''
wahr ist
Wenn es immer noch vergleichen Sie beide Seiten der ODER dann ich dachte, mit diesem
AND (CASE WHEN @search = '' THEN 1
ELSE (CASE WHEN [t4].number like '%'+@search+'%' THEN 1
ELSE 0 END) END) = 1
Edit:ich habe ein paar tests und es sieht aus wie das Gehäuse weniger liest.
- im Allgemeinen, es ist nicht sicher zu verwenden-Kurzschluss (wie in deinem ersten Ausdruck) als Optimierer frei, um zu bewerten, in beliebiger Reihenfolge - siehe http://rusanu.com/2009/09/13/on-sql-server-boolean-operator-short-circuit/
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin mir nicht sicher wie es funktionieren würde mit
LIKE
aber meine aktuelle Lieblings-Weg, um auszudrücken, dass zu sagen ist:Und wenn
@optionalValue
null ist, dann wird diese ausgewertetmyfield = myfield
sonstmyfield
überprüft@optionalValue
.Edit: wie es sich herausstellt, kann man sagen:
Und es scheint zu funktionieren nur fine.
Ausdrücke sind in der Regel von Links nach rechts ausgewertet, aber es gibt keine Garantie, dass immer der Fall sein wird. Sie können helfen, die Kontrolle der Bestellung mit Klammer, aber die Ausführung planen, hängt von einer Menge anderer Faktoren.
Jedoch der Vergleich ein
varchar
Feld gegen'%%'
mitLIKE
passen eh alles.LIKE
Lesen.Überprüfen Sie die unten dargestellten Beispiel wird dies durch pass der Suche, falls es leer ist, sonst wird es eine Suche durchführen...
können Sie prüfen, indem der Nicht gruppierte index auf die Spalte, die nicht geht ist, Scannen Sie die komplette Tabelle durch, um es in den index nutzen, um den unteren Rand der Seite enthält die Adressen aller Datensätze Nicht ClusteredIndex => Zitat
Sind Sie (meist) sicher davon ausgehen, short circuit evaluation in
CASE
- Anweisung, aber nicht in Erklärungen Ihres ersten Typ.Dieser Artikel zeigt Sie wenigstens eine Kante Fall, wo sogar
CASE
Kurzschluss ausfällt.