【问题标题】:Adding SQL Case to provide a default in an Update Query添加 SQL 案例以在更新查询中提供默认值
【发布时间】:2015-02-15 04:25:43
【问题描述】:

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

本质上,IF location known SET u.building_id = b.building_id, ELSE SET u.building_id = 'unknown location';

当前查询如下:

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 案例来完成?我应该如何处理?

【问题讨论】:

  • 进行了更改。对不起'回合

标签: mysql join sql-update case


【解决方案1】:

你可以像这样使用CASE,加上LEFT JOIN

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 = 
    CASE 
       WHEN b.building_id IS NULL THEN 'unknown location'
       ELSE b.building_id
    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');

INNER JOIN 替换为LEFT JOIN 将确保更新所有用户,包括那些没有匹配建筑物的用户(因此是NULL building_id)。请注意,如果在 lat/long 上有多个匹配项,则建筑物的分配将是相当随意的。

SqlFiddle here

【讨论】:

    【解决方案2】:

    你可以试试这个:

    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)
    

    显然您需要更改 location known 以获得逻辑表达式

    【讨论】:

      【解决方案3】:
      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);
      

      【讨论】:

        猜你喜欢
        • 2023-03-25
        • 2019-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多