简体   繁体   中英

SQL Where IN with CASE

I have a where clause as such

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

I like to use a case so it can be smart enough

I have the folloiwng

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

but does nto seem to work. Any way I can get it to work as such.

I'd recommend an EXISTS instead of an 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 
)

Try this, assuming Trucks has zero or one Vantbl / SUBtbl records.

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)

I don't know about CASE but have you thought of using UNION ALL ?

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

No need for CASE where the basic Boolean logic would do:

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

(Assuming Vantbl.VanID and SUVtbl.SUVID cannot be NULL.)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM