2017-02-02 3 views
0

Ich habe eine große Datenmenge, die aus einer Sicht in SQL Server 2012 zurückgegeben wird. Ich muss die Daten anhand von 6 verschiedenen Kriterien filtern. Ich habe Parameter im Bericht eingerichtet und möchte die Parameter in der Abfrage verwenden, um die Größe zu reduzieren.
So habe ich die folgende Situation:Case-Anweisung mit Platzhalter in Where-Klausel

select * from vw_ABC where p1 in @p1 and p2 in @p2 ... 

Der schwierige Teil ist, wie eine Situation zu behandeln, in denen der Benutzer nicht auf eines der Kriterien filtern möchte. Ich versuche dynamisches sql zu vermeiden, aber wenn das der einzige Weg ist, sei es so.
Wenn der Bericht aufgerufen wird, werden dem Benutzer alle 6 Parameter angezeigt. Die Standardwerte sind 'ALL'. Sie können den Bericht mit einem oder allen Parametern erstellen. In den meisten Fällen wird es 2 oder 3 (Name Stadt PLZ Bestell-Dinge wie diese)
Jede Hilfe würde sehr geschätzt werden.

+0

Sprechen Sie wirklich Kampf 'IN' ein Beispiel raben? Oder ist das eher 'where p1 = @ p1 ...'? –

+0

wo (@ p1 = 'ALL' oder p1 = @ p1) und ... Kann Leistungsprobleme haben – Serg

+1

Welche DBMS verwenden Sie? Bitte markieren Sie es. –

Antwort

0

Ich nehme an, Sie sprechen nicht über IN sondern über =. Das wäre:

select * 
from vw_ABC 
where (p1 = @p1 or @p1 = 'ALL') 
    and (p2 = @p2 or @p2 = 'ALL') 
    ... 
0

Ein Ansatz ist es, einen zweiten Satz von Parametern zu erzeugen, um anzuzeigen, ob der entsprechende Parameter verwendet werden muss:

SELECT * 
FROM vw_ABC 
WHERE 
    (@u1=0 OR [email protected]) 
AND (@u2=0 OR [email protected]) 
AND (@u3=0 OR [email protected]) 

Auf diese Weise brauchen Sie nicht zu reservieren Sonderwert für alle: Wenn Sie @pX verwenden möchten, setzen Sie @uX auf 1, wobei X die Parameternummer ist.

+0

Alles, ich werde mehrere Werte für die Parameter haben. Also muss ich prüfen, ob der Wert von p1 "in" der Liste der Werte von @ p1 ist, ungleich dem Parameter. – TheVavs

0

die Parameter als optional einrichten und NULL-Werte überprüfen .... lassen Sie mich für Sie

declare @id int = 1 

select * from users u 
where (@id IS NULL and u.id=u.id) or ([email protected])