【问题标题】:SQL Where IN with CASESQL Where IN 与 CASE
【发布时间】:2012-03-12 06:40:26
【问题描述】:

我有一个这样的 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

但似乎不起作用。我可以通过任何方式使其正常工作。

【问题讨论】:

  • 您使用的是哪种类型的 SQL? MySQL?

标签: sql


【解决方案1】:

我推荐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 
)

【讨论】:

  • +1 阅读代码也更容易理解(而不是用空检查左连接)
  • @BicycleDude 除了一些subtleties regarding NULLs(这里可能不相关),没有令人信服的理由更喜欢 EXISTS 而不是 IN,反之亦然。只需使用最能表达您意图的那个。
  • @BrankoDimitrijevic 取决于数据库的类型。 @MichaelFredrickson 如果您将) OR EXISTS (UNION ALL 交换线路,您可能会获得更好的性能。
  • @Magnus 查询优化器如今非常聪明。如果两个查询表达相同的东西,一个体面的 DBMS 将产生相同的执行计划,而不管使用的语法如何。这里和那里可能有一个奇怪的极端情况,但是:(1)你通常不能说一种语法比另一种更好,除非你在特定 DBMS 的特定条件下测试过它;(2)人们经常重写他们的查询错误地认为他们保留了含义,然后将性能差异归因于句法差异,实际上是查询的语义造成了差异。
  • @BrankoDimitrijevic 我同意。正如你的观点 1 几乎是我之前的评论。就我个人而言,我总是使用Exists,因为我觉得它更容易阅读。
【解决方案2】:

试试这个,假设 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)

【讨论】:

  • 如果 v-t 或 s-t 不是 1 比 1,可能会产生错误的结果。
【解决方案3】:

我不知道CASE,但你有没有想过使用UNION ALL

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

【讨论】:

    【解决方案4】:

    不需要基本布尔逻辑的 CASE:

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

    (假设Vantbl.VanIDSUVtbl.SUVID 不能为NULL。)

    【讨论】:

      猜你喜欢
      • 2011-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-13
      • 1970-01-01
      • 1970-01-01
      • 2013-10-16
      • 1970-01-01
      相关资源
      最近更新 更多