代码之家  ›  专栏  ›  技术社区  ›  Daniel Viglione

在SQL中添加括号会产生不同的结果

  •  2
  • Daniel Viglione  · 技术社区  · 7 年前

    SELECT COUNT(*)
    FROM records
    JOIN other_records ON records.other_record_id = other_records.id
    WHERE other_records.practice = 'Medical' && 
    records.details IS NULL || 
    (records.details <> 'ERROR' && records.details <> 'ERROR BY PRACTICE');
    
    +----------+
    | COUNT(*) |
    +----------+
    |   342668 |
    +----------+
    1 row in set (3.42 sec)
    
    SELECT COUNT(*) FROM records JOIN other_records 
    ON records.other_record_id = other_records.id 
    WHERE other_records.practice = 'Medical' && 
    (records.details IS NULL || (records.details <> 'ERROR' && records.details <> 'ERROR BY PRACTICE'));
    
    +----------+
    | COUNT(*) |
    +----------+
    |   193899 |
    +----------+
    1 row in set (0.46 sec)
    

    据我所知,首先它将与其他联合记录匹配。实践是医学。此时,两者应返回相同的结果集。然后,据我所知,它将匹配细节为空或细节不匹配的错误和实践错误。我不知道为什么括号在这里起作用?

    1 回复  |  直到 7 年前
        1
  •  4
  •   Shawn Mehan    7 年前

    在布尔逻辑中 和 操作人员 && 或 || .

    所以,当你写这篇文章时:

    WHERE other_records.practice = 'Medical' && 
    records.details IS NULL ||
    (records.details <> 'ERROR' && records.details <> 'ERROR BY PRACTICE')
    

    WHERE (other_records.practice = 'Medical' && records.details IS NULL)
    ||
    (records.details <> 'ERROR' && records.details <> 'ERROR BY PRACTICE')
    

    …因此,你的第二个陈述的结果不同。