简易使用案例:我有一个用户和一个设置表,我想为所有用户获取所选时区。
因此我的查询:
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中更改了默认值,我不想更新我的查询。
答案 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;