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;