Mysql 在左联接中,如何用默认列值替换NULL?
简单用例:我有一个用户和一个设置表,我想为所有用户获取所选时区 因此,我的问题是:Mysql 在左联接中,如何用默认列值替换NULL?,mysql,null,left-join,Mysql,Null,Left Join,简单用例:我有一个用户和一个设置表,我想为所有用户获取所选时区 因此,我的问题是: select U.UserId, S.TimeZone from Users as U left join Settings as S on S.UserId = U.UserId; 然而,并不是所有的用户都设置了时区,这就是为什么我选择左连接而不是从设置中选择。这也是我为某些用户获取空值的原因: +--------+--------------------+ | UserId | TimeZo
select U.UserId, S.TimeZone
from Users as U
left join Settings as S on S.UserId = U.UserId;
然而,并不是所有的用户都设置了时区,这就是为什么我选择左连接而不是从设置中选择。这也是我为某些用户获取空值的原因:
+--------+--------------------+
| UserId | TimeZone |
+--------+--------------------+
| 494 | NULL |
| 734 | Europe/Zurich |
| 789 | America/New_York |
现在,我想将空值替换为时区列的默认值:
select U.UserId, IFNULL(S.TimeZone, DEFAULT(S.TimeZone))
from Users as U
left join Settings as S on S.UserId = U.UserId;
但这不起作用,对于没有设置的用户,我仍然得到NULL。我猜这是因为MySQL试图获取不存在的列的默认值(例如,userID494没有列时区)
现在我如何获得默认列值而不是空值。可能吗
当然,我可以将纯文本默认值放在IFNULL中,但如果有一天MySQL中的默认值发生了更改,我不想更新我的查询。请尝试一下这个:
SELECT UserId, IFNULL(sq.TimeZone, DEFAULT(Settings.TimeZone))
FROM (
select U.UserId, S.TimeZone
from Users as U
left join Settings as S on S.UserId = U.UserId
) sq
LEFT JOIN (SELECT TimeZone FROM Settings LIMIT 1) Settings;
您是否在设置表中设置了时区列的默认值?您可能也对这个问题感兴趣:提供适当的DDLsAFAICT可能很有用,这与使用IFNULL相同,因此不会比我在问题中给出的查询更好。
select U.UserId, COALESCE(S.TimeZone, DEFAULT(S.TimeZone)) TimeZone
from Users as U
left join Settings as S on S.UserId = U.UserId;