SQL在何处使用CASE
我有一个where子句SQL在何处使用CASE,sql,Sql,我有一个where子句 ... Where TruckID IN (select VanID from Vantbl) 我喜欢用一个箱子,这样它就足够聪明了 我有以下几点 ... Where TruckID IN CASE WHEN @VehicleType = 'VAN' THEN (select VanID from Vantbl) CASE WHEN @VehicleType = 'SUV' THEN (sel
... Where TruckID IN (select VanID from Vantbl)
我喜欢用一个箱子,这样它就足够聪明了
我有以下几点
... Where TruckID IN
CASE WHEN @VehicleType = 'VAN'
THEN (select VanID from Vantbl)
CASE WHEN @VehicleType = 'SUV'
THEN (select SUVID from SUVtbl)
END
但是nto似乎起作用了。我建议使用
存在的,而不是中的:
WHERE EXISTS (
SELECT 1
FROM Vantbl
WHERE @VehicleType = 'VAN' AND TruckID = VanID
) OR EXISTS (
SELECT 1
FROM SUVtbl
WHERE @VehicleType = 'SUV' AND TruckID = SUVID
)
我不知道案例
,但您是否想过使用联合所有
(
SELECT ...
FROM ...
INNER JOIN VanTbl ON ...
WHERE @VehicleType = 'VAN'
)
UNION ALL
(
SELECT ...
FROM ...
INNER JOIN SUVtbl ON ...
WHERE @VecicleType = 'SUV'
);
试一试,假设卡车
有零条或一条Vantbl
/subBL
记录
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)
不需要使用基本布尔逻辑的情况:
...
WHERE
(@VehicleType = 'VAN' AND TruckID IN (SELECT VanID FROM Vantbl))
OR (@VehicleType = 'SUV' AND TruckID IN (SELECT SUVID FROM SUVtbl))
(假设Vantbl.VanID
和SUVtbl.SUVID
不能为空。)您使用哪种类型的SQL?MySQL?+1也更容易理解,当您阅读代码时(而不是通过空检查离开连接)@BicycleDude除了一些(这在这里可能不相关),没有令人信服的理由选择EXISTS而不是IN,反之亦然。只需使用最能表达您意图的选项即可。@BrankoDimitrijevic取决于数据库的类型@MichaelFredrickson如果您交换您的行)或存在,您可能不会获得更好的性能(
withUNION ALL
@Magnus查询优化器现在非常聪明。如果两个查询表达相同的东西,一个好的DBMS将产生相同的执行计划,而不管使用的语法如何。可能会有一些奇怪的情况,但是:(1)通常不能说一种语法比另一种好,除非您在特定的DBMS和(2)上的特定条件下对其进行了测试人们经常错误地重写他们的查询,以为它们保留了含义,然后将性能差异归因于语法差异,而实际上正是查询的语义造成了差异。@BrankoDimitrijevic我同意。正如你的观点1几乎是我以前的评论。就我个人而言,我总是使用Exists
作为原因是我觉得它更容易阅读。如果v-t或s-t不是1对1,可能会产生错误的结果。