更新表中每行update字段为restartDate与startDate的较新日期
解决方法
你遇到的问题核心是字段名update为SQL保留关键字,直接使用会导致解析异常,同时原SQL的VALUES子查询写法在部分数据库中处理逻辑不符合预期。结合你的需求(restartDate非空、startDate可为空),可以采用以下可靠写法:
方法1:用GREATEST+COALESCE组合
通过COALESCE将空的startDate替换为restartDate,再用GREATEST取两者最大值:
UPDATE mytable SET `update` = GREATEST(restartDate, COALESCE(startDate, restartDate));
- 当startDate非空时,直接比较两个日期取较新值;
- 当startDate为空时,
COALESCE返回restartDate,最终结果即为restartDate本身。
方法2:用CASE语句明确逻辑
如果你的数据库对GREATEST处理null的行为不一致,可通过CASE逻辑直接判断:
UPDATE mytable SET `update` = CASE WHEN startDate IS NOT NULL AND startDate > restartDate THEN startDate ELSE restartDate END;
该写法逻辑直观:仅当startDate存在且晚于restartDate时取startDate,其余情况均取restartDate。
关键注意事项
- 字段名
update是SQL保留关键字,必须用反引号(MySQL)、双引号(PostgreSQL/SQL Server需开启QUOTED_IDENTIFIER)或方括号(SQL Server)包裹,避免解析错误; - 原SQL的
VALUES子查询写法在部分数据库中无法正确识别字段值,可能意外触发默认值(如当前日期)。
验证结果
示例1执行后:
| restartDate | startDate | update |
|---|---|---|
| 2022-11-11 | null | 2022-11-11 |
示例2执行后:
| restartDate | startDate | update |
|---|---|---|
| 2022-11-01 | 2022-11-05 | 2022-11-05 |
内容的提问来源于stack exchange,提问作者sud0
相关产品推荐
相关产品推荐

