gpt4 book ai didi

MySQL 在 WHERE 中带有 IF 或 EXISTS

转载 作者:行者123 更新时间:2023-11-29 00:13:32 24 4
gpt4 key购买 nike

我对表 C 中不存在的 id 的以下查询有疑问。尽管进行了 LEFT JOIN,但如果 tableC 中缺少 id,则 tableA 和 tableB 中的 id 不会出现在结果中。那是因为这些 id 的 tableC.name 不存在。我以为 MySQL 会忽略最后一部分,因为该子句是正确的……但没有。

SELECT
tableA.id, tableA.name
FROM
tableA
LEFT JOIN tableB ON tableA.id = tableB.id
LEFT JOIN tableC ON tableA.id = tableC.id
WHERE
tableA.latin = 'whatever'
AND RIGHT(tableC.name,2) != 'y'

我想在 WHERE 子句的第二部分有一个使用 IF、CASE 或 EXISTS 的解决方案,但是通过以下三次尝试我没有得到我想要的结果(我只显示最后一行):

WHERE
tableA.latin = 'whatever'
AND IF(tableC.name <> 0, RIGHT(tableC.name,2) != 'y', ' ');

这也没有给出错误,但不是预期的结果:

WHERE
tableA.latin = 'whatever'
AND IF(tableC.name = true, RIGHT(tableC.name,2)!= 'y', ' ');

使用 EXISTS 尝试以下操作会在 MySQL Wordbench 编辑器中出现错误:

WHERE
tableA.latin = 'whatever'
AND if(EXISTS tableC.name, RIGHT(tableC.name,2) != 'y', ' ');

最佳答案

任何时候您在 where 子句中引用左联接表中的列(在您的情况下为 tableC.name),您都会强制联接的行为就好像它是内部联接一样。相反,将测试移到连接条件中。

SELECT tableA.id, tableA.name 
FROM tableA
LEFT JOIN tableB
ON tableA.id = tableB.id
LEFT JOIN tableC
ON tableA.id = tableC.id
AND RIGHT(tableC.name,2) != 'y'
WHERE tableA.latin = 'whatever'

关于MySQL 在 WHERE 中带有 IF 或 EXISTS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23792231/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com