【问题标题】:In a Left Join, how to replace NULL by the default column value?在左连接中,如何将 NULL 替换为默认列值?
【发布时间】:2014-12-26 12:11:51
【问题描述】:

简单的用例:我有一个用户表和一个设置表,我想为所有用户获取选定的时区。

因此我的查询:

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 中的默认值发生更改,我不想更新我的查询。

【问题讨论】:

标签: mysql null left-join


【解决方案1】:
select U.UserId, COALESCE(S.TimeZone, DEFAULT(S.TimeZone)) TimeZone
    from Users as U
    left join Settings as S on S.UserId = U.UserId;

【讨论】:

  • AFAICT,这与使用 IFNULL 相同,因此不会比我在问题中给出的查询更好。
【解决方案2】:

请试试这个:

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;

【讨论】:

    猜你喜欢
    • 2017-01-23
    • 2010-12-12
    • 2017-11-01
    • 2017-01-02
    • 1970-01-01
    • 1970-01-01
    • 2012-09-04
    • 2021-02-20
    • 2012-03-20
    相关资源
    最近更新 更多