2016-05-12 4 views
0

Ich habe eine Situation, in der 2 Variablen in eine Abfrage von einem externen System übergeben werden.bedingt filtern Ergebnisse durch den Wert einer Variablen

Wenn die Variable 0 ist, bedeutet das, dass nicht gefiltert wird.

So etwas wie folgt aus:

--if @a = 0 then don't filter by @a 
--if @b = 0 then don't filter by @b 

SELECT * FROM Engines e 
JOIN Transmissions t ON e.carId = t.carId 
WHERE e.engineId IN(@a) 
AND t.transmissionId IN (@b) 

So zum Beispiel, wenn @a 0 war, dann nur Sorgen um die Übertragungen zu filtern. Und die Abfrage würde im Wesentlichen sein:

SELECT * FROM Engines e 
JOIN Transmissions t ON e.carId = t.carId 
WHERE t.transmissionId IN (@b) 

Oder wenn @b 0 war, dann wäre es dieses mag:

SELECT * FROM Engines e 
JOIN Transmissions t ON e.carId = t.carId 
WHERE e.engineId IN(@a) 

Oder wenn beide @a und @b waren 0, dann zeigen alles wie folgt aus:

SELECT * FROM tblA a 
JOIN tblB b ON a.carId = b.carId 

Gibt es eine Möglichkeit, bedingt wie folgt zu filtern?

Dank

Antwort

1

NAHME: beide @a und @b 0.

Ausfall von

haben Dies sollte es tun:

--if @a = 0 then don't filter by @a 
--if @b = 0 then don't filter by @b 

SELECT * FROM Engines e 
JOIN Transmissions t ON e.carId = t.carId 
WHERE (@a = 0 OR e.engineId IN(@a)) 
     AND (@b = 0 OR t.transmissionId IN (@b)) 
1

Versuchen Sie folgendes:

CREATE TABLE #Engines 
    (
     engineId INT 
    , EngineName CHAR(5) 
    , carId INT 
    ); 
CREATE TABLE #Transmissions 
    (
     transmissionId INT 
    , Transmitter CHAR(5) 
    , carId INT 
    ); 
INSERT INTO #Engines 
     (engineId, EngineName, carId) 
VALUES (0, 'a', 10), 
     (1, 'b', 20), 
     (2, 'c', 30), 
     (3, 'd', 40), 
     (4, 'e', 50); 

INSERT INTO #Transmissions 
     (transmissionId, Transmitter, carId) 
VALUES (0, 'aa', 10), 
     (1, 'bb', 20), 
     (2, 'cc', 30), 
     (3, 'dd', 40), 
     (4, 'ee', 60); 

DECLARE @a INT= 4 
    , @b INT= 0; 

DECLARE @where VARCHAR(MAX) 
    , @sql VARCHAR(MAX); 
SET @where = (SELECT CASE WHEN @a = 0 
            AND @b <> 0 
          THEN '1=1 and t.transmissionId IN (@b)' 
          WHEN @b = 0 
            AND @a <> 0 
          THEN '1=1 and e.engineId IN (@a)' 
          ELSE '1=1' 
         END 
      ); 
--SELECT @where; 
SET @sql = 'SELECT e.engineId 
     , e.EngineName 
     , e.carId 
     , t.transmissionId 
     , t.Transmitter 
     , t.carId 
FROM #Engines e 
     JOIN #Transmissions t 
     ON e.carId = t.carId 
WHERE '; 
--SELECT @sql; 
DECLARE @FinalSql VARCHAR(MAX) = 'DECLARE @a INT=3 
    , @b INT= 0; ' + @sql + @where; 
--SELECT @FinalSql; 
--SELECT @FinalSql; 
EXECUTE(@FinalSql); 
1

Diese wird dir definitiv helfen

SELECT * FROM Engines e 
JOIN Transmissions t ON e.carId = t.carId 
WHERE 
e.engineId IN @a or isnull(@a,0)= 0) 
AND 
t.transmissionId IN @b or isnull(@b,0)= 0) 
1

@Pankaj Kumar: Es funktioniert, aber es gibt einen Syntaxfehler in Ihrem Code. Ich kann keinen Kommentar hinzufügen, um ihn als eine andere Antwort hinzuzufügen:

SELECT * 
FROM Engines e 
     JOIN Transmissions t 
     ON e.carId = t.carId 
WHERE (e.engineId IN (@a) 
      OR ISNULL(@a, 0) = 0 
     ) 
     AND (t.transmissionId IN (@b) 
       OR ISNULL(@b, 0) = 0 
      );