在Left Join中,如何用默认列值替换NULL?

时间:2014-10-30 12:39:42

标签: mysql null left-join

简易使用案例:我有一个用户和一个设置表,我想为所有用户获取所选时区。

因此我的查询:

select U.UserId, S.TimeZone
    from Users as U
    left join Settings as S on S.UserId = U.UserId;

然而,并非所有用户都设置了时区,这就是我执行左连接而不是从“设置”中选择的原因。这也是我为某些用户获取NULL值的原因:

+--------+--------------------+
| UserId | TimeZone           |
+--------+--------------------+
|    494 | NULL               |
|    734 | Europe/Zurich      |
|    789 | America/New_York   |

现在我想用TimeZone列的默认值替换NULL值:

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试图获得不存在的列的默认值(例如,UserId 494没有列TimeZone)。

现在如何获取默认列值而不是NULL值。有可能吗?

当然我可以将纯文本默认值放在IFNULL中,但是如果有一天在MySQL中更改了默认值,我不想更新我的查询。

2 个答案:

答案 0 :(得分:3)

select U.UserId, COALESCE(S.TimeZone, DEFAULT(S.TimeZone)) TimeZone
    from Users as U
    left join Settings as S on S.UserId = U.UserId;

答案 1 :(得分:0)

请求尝试这个:

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;