Wie man mit mehreren Parametern sucht, während ich Null in den Ergebnissen in SQL-server einbeziehe

Ich versuche, eine einfache Abfrage zu konstruieren, die es dem Benutzer ermöglicht, eine list von Clients zu filtern, die auf demografischen Informationen basieren. Es scheint mir, dass LIKE die einfachste Lösung wäre, zum Beispiel:

 SELECT D.Name FROM demographics D WHERE D.City LIKE @cityVar AND D.Sex LIKE @sexVar AND D.Age LIKE @ageVar ... 

variables werden in die Abfrage über Kombinationsfelder übergeben. Wenn also der Benutzer entscheidet, nicht auf der Grundlage eines gegebenen Parameters zu filtern, gebe ich einfach '%' an die Variable, um diese Zeile in der WHERE Klausel effektiv zu entkommen.

Dies funktioniert jedoch nicht, wenn ich Zeilen mit NULL Werten in gefilterten Feldern zurückgeben möchte. Zum Beispiel, wenn D.Employer einen Wert von NULL , ist der Kunde arbeitslos; aber passiert '%' an @employedVar (was bedeutet, dass der Benutzer gerne sowohl Beschäftigte als auch arbeitslose Kunden zurückgeben würde) ignoriert alle Zeilen, in denen D.Employer NULL .

Wie konstruiere ich die Logik der WHERE Klausel, um eine große Anzahl von Parametern zu berücksichtigen, während dem Benutzer immer noch möglich ist, die Filterung auf einem beliebigen Parameter zu entgehen, wobei die NULL Werte ggf. enthalten sind?

Das einfachste wäre, so etwas zu tun

 SELECT D.Name FROM demographics D WHERE (D.City LIKE @cityVar OR @cityVar == '%') AND (D.Sex LIKE @sexVar OR @sexVar == '%') AND (D.Age LIKE @ageVar OR @ageVar == '%') 

Es ist wichtig, dass man so etwas nicht benutzt

 SELECT D.Name FROM demographics D WHERE ISNULL(D.City. '') LIKE @cityVar AND ISNULL(D.Sex, '') LIKE @sexVar AND ISNULL(D.Age, '') LIKE @ageVar 

Wenn Sie die Werte in eine function übergeben, wird es so gemacht, dass SQL server keine Indizes verwenden kann, die Sie auf diesen Spalten haben können. Dies führt zu ineffizienten Abfrageplänen und schlechter performance.

Das könnte für dich funktionieren. Wie wäre es mit der Interpretation von null in der Prozedur, um anzuzeigen, dass der Benutzer alles außer null will. Mit anderen Worten, wenn der Benutzer nichts angegeben hat, geben wir ihnen alles mit einem Wert zurück. So etwas wie dieses:

 SELECT ... FROM ... WHERE ((@parm1 IS NULL AND field1 IS NOT NULL) OR (field1 LIKE '%' + @parm1 + '%')) 

Diese Abfrage gibt alle Zeilen zurück, die einen Wert haben, wenn der Benutzer nichts angegeben hat, aber wenn sie es taten, wird es das LIKE laufen lassen.

Dies bedeutet nur, dass aus der Anwendung, wenn der Benutzer nichts spezifiziert (oder vielleicht in Ihrem Fall spezifiziert alle ), senden Sie null an die Prozedur.