Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL在何处使用CASE_Sql - Fatal编程技术网

SQL在何处使用CASE

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

    ... 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如果您交换您的行
)或存在,您可能不会获得更好的性能(
with
UNION ALL
@Magnus查询优化器现在非常聪明。如果两个查询表达相同的东西,一个好的DBMS将产生相同的执行计划,而不管使用的语法如何。可能会有一些奇怪的情况,但是:(1)通常不能说一种语法比另一种好,除非您在特定的DBMS和(2)上的特定条件下对其进行了测试人们经常错误地重写他们的查询,以为它们保留了含义,然后将性能差异归因于语法差异,而实际上正是查询的语义造成了差异。@BrankoDimitrijevic我同意。正如你的观点1几乎是我以前的评论。就我个人而言,我总是使用
Exists
作为原因是我觉得它更容易阅读。如果v-t或s-t不是1对1,可能会产生错误的结果。