Mysql 添加SQL Case以在更新查询中提供默认值

Mysql 添加SQL Case以在更新查询中提供默认值,mysql,join,sql-update,case,Mysql,Join,Sql Update,Case,我正在处理一个查询,该查询将根据用户的lat/long坐标将用户分配到特定的建筑。该查询确实有效,并为关联用户分配了一个建筑id值,但如果用户当前位置不存在建筑,我想分配一个“未知位置”的值 本质上,如果位置已知设置u.building_id=b.building_id,否则设置u.building_id=‘未知位置’ 当前查询如下: UPDATE USERS u JOIN BUILDINGS b ON u.latitude BETWEEN (b.latitude - 0.001) AND (

我正在处理一个查询,该查询将根据用户的lat/long坐标将用户分配到特定的建筑。该查询确实有效,并为关联用户分配了一个建筑id值,但如果用户当前位置不存在建筑,我想分配一个“未知位置”的值

本质上,如果位置已知设置u.building_id=b.building_id,否则设置u.building_id=‘未知位置’

当前查询如下:

UPDATE USERS u 
JOIN BUILDINGS b ON u.latitude BETWEEN (b.latitude - 0.001) AND (b.latitude + 0.001)
    AND u.longitude BETWEEN (b.longitude - 0.001) AND (b.longitude + 0.001)
SET u.building_id = b.building_id
我认为这可以通过添加SQL用例来实现?我应该如何处理这个问题?

您可以尝试以下方法:

UPDATE USERS u JOIN BUILDINGS b ON u.latitude BETWEEN (b.latitude - 0.001) AND (b.latitude + 0.001)
AND
u.longitude BETWEEN (b.longitude - 0.001) AND (b.longitude + 0.001)
SET u.building_id = (case when **location known** then u.building_id = b.building_id ELSE u.building_id = 'unknown location' END)

显然,您需要更改逻辑表达式的已知位置

虽然就我个人而言,我会使用
COALESCE
做同样的事情:

UPDATE USERS u
LEFT JOIN BUILDINGS b 
     ON u.latitude BETWEEN (b.latitude - 0.001) AND (b.latitude + 0.001)
     AND u.longitude BETWEEN (b.longitude - 0.001) AND (b.longitude + 0.001)
SET u.building_id = COALESCE(b.building_id, 'unknown location');
内部连接
替换为
左连接
将确保更新所有用户,包括没有匹配建筑的用户(因此
空建筑id
)。注意,如果lat/long上有多个匹配项,则建筑物的分配将相当随意


进行了更改。对不起,哈
UPDATE USERS u
LEFT JOIN BUILDINGS b 
     ON u.latitude BETWEEN (b.latitude - 0.001) AND (b.latitude + 0.001)
     AND u.longitude BETWEEN (b.longitude - 0.001) AND (b.longitude + 0.001)
SET u.building_id = COALESCE(b.building_id, 'unknown location');
UPDATE USERS u LEFT JOIN BUILDINGS b ON u.latitude BETWEEN (b.latitude - 0.001) AND (b.latitude + 0.001)
AND
u.longitude BETWEEN (b.longitude - 0.001) AND (b.longitude + 0.001)
SET u.building_id = IF( ISNULL(b.building_id), 'unknown', b.building_id);