代码之家  ›  专栏  ›  技术社区  ›  Perry

为什么这3个查询没有返回正确的记录

  •  0
  • Perry  · 技术社区  · 6 年前

    我有一个返回4列45行的SQL查询。

    Select ComplaintID, ProblemStreet, ProblemCrossStreet,ProblemSubdivision
     From Complaints 
     where ProblemCrossStreet Like '%PARK MANOR%' OR ProblemStreet Like '%PARK 
    MANOR%' Or ProblemSubdivision Like '%PARK MANOR%'
    

    此查询返回4列31行:

    DECLARE @a as varchar(Max) = 'PARK MANOR'
    Select ComplaintID, ProblemStreet, ProblemCrossStreet,ProblemSubdivision
    From Complaints 
     where ProblemCrossStreet Like @a OR ProblemStreet Like @a Or 
    ProblemSubdivision Like @a
    

    DECLARE @a as varchar(Max) = 'PARK MANOR'
    Select  ComplaintID,ProblemCrossStreet From Complaints Where 
    ProblemCrossStreet like @a
    Union ALL
    Select ComplaintID,ProblemStreet from Complaints Where ProblemStreet Like @a
    Union ALL
    Select ComplaintID, ProblemSubdivision From Complaints where 
    ProblemSubdivision like @a
    

    最后一个查询怎么只返回34行?为什么这3个看起来相同的查询不返回相同的值,最重要的是,如何让我的第三个查询返回这2列和45行?

    2 回复  |  直到 6 年前
        1
  •  2
  •   DanB    6 年前

    DECLARE @a as varchar(Max) = '%PARK MANOR%'
    

    where ProblemCrossStreet Like CONCAT('%', @a, '%') OR ProblemStreet Like CONCAT('%', @a, '%') Or 
    ProblemSubdivision Like CONCAT('%', @a, '%')
    
        2
  •  2
  •   Gordon Linoff    6 年前

    简单:

    ProblemCrossStreet Like 'PARK MANOR'
    

    ProblemCrossStreet Like '%PARK MANOR%'
    

    做不同的事情。第一个寻找一个精确的匹配。第二种方法在名称中的任何地方寻找模式。

    union all . 所以,如果一行匹配两个条件,那么表单返回两行。

    你到底想要哪一个还不清楚。如果需要通配符匹配,则在 like 图案。如果您希望每个匹配都有一个单独的行,那么使用

    编辑:

    declare @a as varchar(Max) = 'PARK MANOR';
    
    Select  ComplaintID, ProblemCrossStreet
    From Complaints
    Where ProblemCrossStreet like concat('%', @a, '%')
    Union ALL
    Select ComplaintID, ProblemStreet
    from Complaints
    Where ProblemStreet Like concat('%', @a, '%')
    Union ALL
    Select ComplaintID, ProblemSubdivision
    From Complaints
    where ProblemSubdivision like concat('%', @a, '%');