2016-07-28 17 views
0

ist Ich weiß, dass dies eine grundlegende Frage ist, aber ich kann nicht mit der richtigen Kombination von Suchbegriffen kommen, um die Antwort zu bekommen, die ich brauche.Wählen Sie alle Datensätze aus, wenn der Parameter -1

Ich arbeite an einer gespeicherten Prozedur, wo ein Parameter @AccountTypeId ist. Der Parameter kann 1, 2, 3 oder -1 sein. Wenn @AccountTypeId-1 ist, sollte alle Kontotypen (1, 2 und 3) zurückgegeben werden. Ich kann ein SP leicht genug, um schreiben, die auf @AccountTypeId Basis wird Filter:

CREATE PROCEDURE Accounts_SP (@AccountTypeId INT) 
AS 
SELECT * 
FROM Accounts 
WHERE AccountTypeId = @AccountTypeId 

Das Problem der SP Rückkehr alle AccountType s aufweist, wenn @AccountTypeId-1 ist.

Ich habe versucht, eine CASE Anweisung in der WHERE Klausel wie folgt aus:

CREATE PROCEDURE Accounts_SP (@AccountTypeId INT) 
AS 
SELECT * 
FROM Accounts 
WHERE AccountTypeId IN (CASE @AccountTypeId WHEN -1 
          THEN (SELECT AccountTypeId FROM AccountTypes) 
          ELSE @AccountTypeId 
         END) 

Aber es gibt mir die folgende Fehlermeldung:

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

Ich bin sicher, dass es eine einfache Möglichkeit, um all die Rekorde zu bekommen und ich übertreibe nur die Dinge. Kann mir bitte jemand in die richtige Richtung zeigen?

Antwort

2

Sie könnten eine OR-Anweisung verwenden, die natürlich immer wahr ist, wenn Sie -1 senden und so alle Zeilen auswählt.

SELECT * 
FROM Accounts 
WHERE AccountTypeId = @AccountTypeId 
OR @AccountTypeId = -1 
+0

Ich wusste, dass es so etwas einfach war. Ich akzeptiere die Antwort, nachdem das Zeitlimit abgelaufen ist. Vielen Dank!! –

1

Jedes Mal, wenn ich mit dieser Forderung konfrontiert bin (und es ist oft), ich nutze die COALESCE Funktion in SQL Server. COALESCE gibt den ersten Nicht-Null-Wert zurück, also würde es ungefähr so ​​aussehen. Beachten Sie, dass @Param geändert wird, um NULL zu unterstützen.

CREATE PROCEDURE Accounts_SP (@AccountTypeId INT = NULL) 
AS 
SELECT * 
FROM Accounts 
WHERE AccountTypeId = COALESCE(@AccountTypeId, AccountTypeId)