MySQL和(可选)

zengzsys  于 2023-02-03  发布在  Mysql
关注(0)|答案(4)|浏览(96)
AND t1.Team IN (SELECT Team FROM t2 WHERE t3.ID = t2.ID)

我怎样才能使上述AND为可选的,如果子查询没有任何结果,甚至不考虑AND t1.Team IN ("")
类似这样的事情是行不通的:

AND IF((SELECT Team FROM t2 WHERE t3.ID = t2.ID), (t1.Team IN (SELECT Team FROM t2 WHERE t3.ID = t2.ID)), 1)
1hdlvixo

1hdlvixo1#

形式上你需要

AND (    t1.Team IN (SELECT Team FROM t2 WHERE t3.ID = t2.ID)
      OR NOT EXISTS (SELECT Team FROM t2 WHERE t3.ID = t2.ID)
      )

但是在您的情况下,将这个子查询移动到FROM子句并使用适当的左连接似乎更合理。

njthzxwz

njthzxwz2#

您可以在SQL查询语法中使用Case语句来检查if else条件。
为此,我认为您的查询如下所示:

AND 
  CASE 
    WHEN (SELECT COUNT(*) FROM t2 WHERE t3.ID = t2.ID) > 0 THEN t1.Team IN (SELECT Team FROM t2 WHERE t3.ID = t2.ID)
    ELSE 1=1
  END
cedebl8k

cedebl8k3#

可能会快一些(如果t1.Team不为NULL):

AND t1.Team IN (
  SELECT Team FROM t2 WHERE t3.ID = t2.ID 
  UNION 
  SELECT t1.Team
)
yvgpqqbh

yvgpqqbh4#

下面是一个保持查询简单和良好性能的技巧:

AND IFNULL(
(
    SELECT  MAX(IIF(t1.Team = t2.Team, 1, 0))
    FROM    t2
    WHERE   t3.ID       =   t2.ID
), 1)       =   1

说明:
该子查询执行以下操作:
1.按团队比较t2和t1中的所有行
1.如果有匹配的Team-将返回1,否则返回0
1.如果t2中根本没有行-将返回NULL

  1. IFNULL会将NULL结果转换为1
    1.因此我们期望子查询的结果为1
    这意味着在2种情况下,子查询将返回1:
  • 如果在T2中没有找到行
  • 或者如果在t2中找到匹配的Team

相关问题