Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

CASE-Anweisung innerhalb der WHERE-Klausel in SQL Server 2008

Zuerst einmal der CASE Anweisung muss Teil sein des Ausdrucks, nicht der Ausdruck selbst.

Mit anderen Worten, Sie können Folgendes haben:

WHERE co.DTEntered = CASE 
                          WHEN LEN('blah') = 0 
                               THEN co.DTEntered 
                          ELSE '2011-01-01' 
                     END 

Aber es wird nicht so funktionieren, wie Sie es geschrieben haben, zB:

WHERE 
    CASE LEN('TestPerson')
        WHEN 0 THEN co.personentered  = co.personentered
   ELSE co.personentered LIKE '%TestPerson'
    END 

Möglicherweise haben Sie mehr Glück, wenn Sie kombinierte ODER-Anweisungen wie diese verwenden:

WHERE (
        (LEN('TestPerson') = 0 
             AND co.personentered = co.personentered
        ) 
        OR 
        (LEN('TestPerson') <> 0 
             AND co.personentered LIKE '%TestPerson')
      )

Allerdings bin ich mir nicht sicher, wie groß der Abfrageplan ist, den Sie bekommen werden. Diese Art von Spielereien in einem WHERE -Klausel verhindert häufig, dass der Abfrageoptimierer Indizes verwendet.