Bedingter Operator in SQL Where-Klausel

7

Ich wünschte, ich könnte etwas in SQl Server 2005 (das ich weiß, ist nicht gültig) für meine WHERE-Klausel tun. Manchmal ist @teamID (übergeben an eine gespeicherte Prozedur) der Wert einer existierenden teamID, sonst ist es immer Null und ich möchte alle Zeilen aus der Team Tabelle.

Ich habe mit Case geforscht und der Operator muss vor oder nach der gesamten Aussage kommen, was verhindert, dass ich einen anderen Operator habe, basierend auf dem Wert von @teamid. Andere Vorschläge als das Duplizieren meiner Select-Anweisungen.

%Vor%     
Marc 02.04.2010, 19:37
quelle

5 Antworten

18

Sie können das ohne einen Fall tun:

%Vor%     
Andomar 02.04.2010, 19:38
quelle
5

Ohne dynamisches SQL zu verwenden, ist die leistungsstärkste Option:

%Vor%

Verwenden von dynamischem SQL:

%Vor%

Beachten Sie, dass sp_EXECUTESQL den Abfrageplan zwischenspeichert, während EXEC dies nicht tut. Lesen Sie dies: Ссылка

    
OMG Ponies 02.04.2010 19:42
quelle
2

Was ist mit:

%Vor%     
Program.X 02.04.2010 19:39
quelle
2

Noch einfacher als Andomars Antwort und unter der Annahme, dass id niemals 0 ist (wie bei den meisten Auto-Inkrement-IDs) ist

%Vor%

Dieses Prädikat ist immer wahr, wenn @teamid Null ist und ansonsten nur wahr, wenn es mit der TeamId einer bestimmten Zeile übereinstimmt.

Beachten Sie jedoch: Dies funktioniert ziemlich effizient auf Sybase 11 oder höher; es funktionierte ziemlich ineffizient auf MS SQL Server 2003; Ich weiß nicht, wie es auf der aktuellen Version von MS SQL Server funktioniert.

Sie können auch Groß- / Kleinschreibung verwenden; Sie müssen nur den Fall in Where-Klausel setzen, nicht die Where-Klausel in dem Fall. Ihre ursprüngliche Abfrage wäre also:

%Vor%

Beachten Sie, dass dies jedoch wahrscheinlich weniger effizient ist, da es pro Zeile ausgewertet werden muss und wahrscheinlich auch zu einem vollständigen Tabellenscan führt.

Das Formular, das ich oben angegeben habe, wird wahrscheinlich von einem intelligenten Abfrageoptimierer neu geschrieben (Ihr Kilometerstand hängt von Ihrem RDBMS ab), um einen Index zu verwenden, wenn @teamid nicht Null ist.

    
tpdi 02.04.2010 20:43
quelle
0

Wenn Sie Null als alle Datensätze behandeln könnten:

%Vor%     
JeffO 02.04.2010 20:30
quelle