2016-05-18 9 views
0

Ich versuche, so etwas wie zu schreiben:Kurzschluss WHERE CASE Verwendung enthält ein ENTHÄLT

SELECT Id FROM SomeTable 
WHERE 
CASE WHEN (@param IS NULL) THEN 
    1 
ELSE 
    CONTAINS([FullText],@param) 
END = 1 

aber ich kann nicht SQL Server scheinen zu bekommen nicht über die Syntax zu beschweren. Gibt es eine Möglichkeit CASE zum Kurzschließen der CONTAINS-Suche zu verwenden?

sogar so etwas wie dies zu tun scheint nicht zu Kurzschluss:

 CASE WHEN (@param IS NULL) THEN 
      1 
     ELSE 
      (CASE WHEN CONTAINS([FullText], @param) THEN 
       1 
      ELSE 
       0 
      END) 
     END = 1 
+2

Mögliches Duplikat von [Wird der SQL WHERE-Klausel-Kurzschluss ausgewertet?] (Http://stackoverflow.com/questions/789231/is-the-sql-where-clause-short-circuit-evaluated) – naomik

+0

Verwendung von ' OR 'sollte ausreichend sein, da die Anweisungen von links nach rechts ausgewertet würden (zB 'WHERE @param IST NULL ODER ENTHÄLT ([FullText], @param)') – Anthony

+0

@Anthony Nope; Siehe die verknüpfte Frage. –

Antwort

1

Wenn Sie den Ausführungsplan sehen Sie, dass case zu einer Reihe von if... else übersetzt sehen können, wo beide Teil ausgeführt werden.
Es ist wie der einzige Weg scheint, ist die Ausführung von unerwünschten Teil zu vermeiden

if @param is null 
    select * from myTable 
else 
    select * from myTable 
    where <expensive condition check> 
+0

Leider kann ich 'IF' in meinem speziellen Szenario nicht verwenden. –

1

vereinfachen Sie Ihre Anfrage:

SELECT Id FROM SomeTable 
WHERE @param IS NULL OR CONTAINS([FullText],@param) 

Also, wenn @param ist NULL es nicht für die zweite Bedingung überprüfen wird (Kurzschluss)

+0

SQL Server garantiert kein Kurzschlussverhalten; Die CONTAINS in Ihrer Abfrage werden einen Null-Prädikat-Fehler auslösen. –

+0

@ Mr.Smith können Sie eine SQL-Geige bereitstellen? Werfen Sie einen Blick auf diesen Beitrag, um den Prädiktionsfehler zu behandeln http://stackoverflow.com/questions/9216608/is-full-text-search-contains-clause-always-evaluated. Die Abfrage ist in Ordnung, fügen Sie nur einige kleinere Validierungen für die 'contains'-Funktion hinzu – Sherlock

0

Da sQL Server nicht Kurzschlussbedingungen garantiert, können Sie etwas tun können die null-Prädikat Fehler zu vermeiden:

Auf diese Weise erhalten Sie keinen Fehler, wenn @param null ist. Ich bin mir jedoch nicht so sicher über die Leistung - wenn es keine Kurzschlussbedingungen gibt, bedeutet dies, dass möglicherweise beide Teile der where-Klausel ausgewertet werden und das könnte eine Weile dauern.

Verwandte Themen