其他分享
首页 > 其他分享> > 在左联接中,如何用默认列值替换NULL?

在左联接中,如何用默认列值替换NULL?

作者:互联网

易于使用的案例:我有一个“用户”和“设置”表,我想为所有用户获取选定的时区.

因此,我的查询:

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中更改默认值,我就不必更新查询.

解决方法:

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

标签:null,left-join,mysql
来源: https://codeday.me/bug/20191121/2049219.html