mysql - 在 where 中使用自定义函数左连接过滤空值

标签 mysql sql foreign-keys left-join

我有一个引用城市表的表,其键名为 cityId。 我使用此查询从中获取数据:

SELECT t.ID, city.areaId FROM transp t
LEFT JOIN city ON city.ID = t.cityId;

像这样,它按原样返回表,如果 city.areaId 为空,则返回 NULL。

但是当我向使用 city.areaId 的 where 子句添加函数时,即使函数始终为真,查询也不会显示包含 cityId 的行一片空白。例如:

SELECT t.ID, city.areaId FROM transp t
LEFT JOIN city ON city.ID = t.cityId
WHERE always_true(city.areaId);

不会显示任何包含空 cityId 的行。我不明白为什么会这样,因为我使用的是 left join,如果我将函数放在 SELECT 中,我可以看到它确实总是正确的。

SQLFiddle

最佳答案

好吧,虽然看起来 MySQL 做了一些内部优化,但我认为这是错误的(在这种情况下将左连接转换为内部连接是不正确的),但有一个解决方法

SELECT t.ID, city.areaId
FROM transp t
LEFT JOIN city ON city.ID = t.cityId
WHERE always_true(coalesce(city.areaId, null));

关于mysql - 在 where 中使用自定义函数左连接过滤空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43851132/

相关文章:

php - 检查实体是否在外表中被引用并获取实体

php - 我如何从不同页面中选择的列表中获取 ID?使用 PHP/MySQL

sql-server - 数据库中已经有一个名为 'tblPerson_Gender_FK' 的对象

mysql - 转换一个有效的 SQL NOT IN

java - 使用 SQL Server 和 MyBatis 的批处理 "insert if missing"

sql - 选择Oracle中某个类型的所有索引

sql - 计算两天的价差

Python:将字符串插入Mysql数据库

mysql - 我可以获取特定格式的时间戳吗

php - 我的 "remember me"-功能