2012-02-21 3 views
2

У меня есть где положение в качестве такойSQL Где IN с ДЕЛУ

... Where TruckID IN (select VanID from Vantbl) 

Мне нравится использовать случай, так что он может быть достаточно умна

У меня есть folloiwng

 ... Where TruckID IN 
     CASE WHEN @VehicleType = 'VAN' 
     THEN (select VanID from Vantbl) 
     CASE WHEN @VehicleType = 'SUV' 
     THEN (select SUVID from SUVtbl) 
    END 

но похоже, не работает. В любом случае я могу заставить его работать как таковой.

+1

Какой тип SQL вы используете? MySQL? – simchona

ответ

5

Я рекомендую EXISTS вместо IN:

WHERE EXISTS (
    SELECT 1 
    FROM Vantbl 
    WHERE @VehicleType = 'VAN' AND TruckID = VanID 
) OR EXISTS (
    SELECT 1 
    FROM SUVtbl 
    WHERE @VehicleType = 'SUV' AND TruckID = SUVID 
) 
+0

+1 согласовано. Всегда лучше использовать 'EXISTS'' над' IN'. –

+0

+1 Также легче понять, когда вы читаете код (а не левое соединение с нулевой проверкой) – Magnus

+0

@BicycleDude Кроме некоторых [тонкостей относительно NULL] (http://stackoverflow.com/a/9344100/533120) (что вероятно, не имеет значения здесь), нет никаких веских оснований предпочитать EXISTS над IN или наоборот. Просто используйте то, что выражает ваше намерение лучше всего. –

0

Я не знаю, о CASE, но вы думали использовать UNION ALL?

(
SELECT ... 
FROM ... 
INNER JOIN VanTbl ON ... 
WHERE @VehicleType = 'VAN' 
) 
UNION ALL 
(
SELECT ... 
FROM ... 
INNER JOIN SUVtbl ON ... 
WHERE @VecicleType = 'SUV' 
); 
1

Попробуйте это, предполагая, что Trucks имеет ноль или один Vantbl/SUBtbl записи.

SELECT * 
    FROM Trucks t 
    LEFT JOIN Vantbl v ON v.VanID = t.TruckID 
    LEFT JOIN SUVtbl s ON s.SUVID = t.TruckID 
    WHERE (@VehicleType = 'VAN' AND v.VanID IS NOT NULL) 
    OR (@VehicleType = 'SUV' AND s.SUVID IS NOT NULL) 
+2

Возможно генерировать неверные результаты, если v-t или s-t не 1-к-1. – RichardTheKiwi

+0

Правда. Отредактировано сообщение. –

0

Нет необходимости в случае, когда основная Булева логика будет делать:

... 
WHERE 
    (@VehicleType = 'VAN' AND TruckID IN (SELECT VanID FROM Vantbl)) 
    OR (@VehicleType = 'SUV' AND TruckID IN (SELECT SUVID FROM SUVtbl)) 

(. Предполагая, что Vantbl.VanID и SUVtbl.SUVID не может быть NULL)

Смежные вопросы