我有这个SQL查询,它返回4列和45行。
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
这个查询是我需要返回的,它应该是2列45行
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行呢?
答案 0 :(得分:2)
用%声明变量。
DECLARE @a as varchar(Max) = '%PARK MANOR%'
或更新您的查询以添加%
where ProblemCrossStreet Like CONCAT('%', @a, '%') OR ProblemStreet Like CONCAT('%', @a, '%') Or
ProblemSubdivision Like CONCAT('%', @a, '%')
答案 1 :(得分:2)
简单:
ProblemCrossStreet Like 'PARK MANOR'
和
ProblemCrossStreet Like '%PARK MANOR%'
做不同的事情。第一个寻找精确匹配。第二个在名称中的任意位置查找模式。
对于第三个查询,它使用的是union all
。因此,如果一行匹配两个条件,则form返回两行。
尚不清楚您真正想要哪个。如果要使用通配符匹配,请在like
模式中包含通配符。如果您想为每个匹配项单独放置一行,请使用union all
。
编辑:
您似乎想要:
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, '%');