2016-05-12 37 views
0

我有兩個變量從外部系統傳遞到查詢中的情況。有條件地過濾由變量值確定的結果

如果變量爲0,那就意味着不要過濾它。

因此,像這樣:

--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) 

因此,舉例來說,如果@a爲0,那麼只擔心過濾傳輸。和查詢將基本上是:

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

或者,如果@b是0,那麼它會是這樣的:

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

或者,如果雙方@a和@b爲0,則表明一切是這樣的:

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

有沒有辦法像這樣有條件地過濾?

感謝

回答

1

的假設:這兩種@a和@b具有0

默認這應做到:

--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

試試這個:

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

這一定會對你有所幫助

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:它可以工作,但是代碼中有語法錯誤。我無法添加評論,因此將其添加爲其他答案:

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 
      );