SQL Server中如何筛选包含指定街道的聚合行?
问题
我在SQL Server中有一张包含聚合地址列的表,结构如下,需要筛选出所有包含Street A或Street B的行:
| Name | Adresses |
|---|---|
| Mike | Street A, Street B, Street C |
| Smith | Street B |
| Jimmy | Street C |
我尝试了以下SQL语句,但都没得到预期结果:
Declare @street table (col nvarchar (50) ) INSERT INTO @street Values ('Street A'), ('Street B' ) SELECT * FROM Table WHERE Adresses like '%' + @street + '%' SELECT * FROM Table WHERE Adresses = ( SELECT * FROM @street ) SELECT * FROM Table WHERE STRING_SPLIT(Adresses,',') in ( SELECT * FROM @street )
预期的正确结果集是:
| Name | Adresses |
|---|---|
| Mike | Street A, Street B, Street C |
| Smith | Street B |
解决方法
你的问题出在这几个点:
- 第一个查询直接用表变量
@street拼接LIKE条件是错误的,表变量不能直接和字符串做拼接操作。 - 第二个查询用
=匹配子查询结果,只有当Adresses完全等于子查询中的某一个值时才会命中,但Mike的地址是多街道组合,所以不会被选中。 - 第三个查询使用
STRING_SPLIT的方式错误,该函数返回的是表结构,不能直接用IN判断;另外拆分后的字符串可能带有前导空格(比如, Street B拆分后是Street B),会导致和目标值不匹配。
下面是两种可行的解决方案:
方法1:结合EXISTS与STRING_SPLIT(处理空格问题)
DECLARE @street TABLE (col NVARCHAR(50)) INSERT INTO @street VALUES ('Street A'), ('Street B') SELECT t.* FROM YourTable t WHERE EXISTS ( SELECT 1 FROM STRING_SPLIT(t.Adresses, ',') s WHERE LTRIM(RTRIM(s.value)) IN (SELECT col FROM @street) )
用LTRIM(RTRIM())去除拆分后字符串的前后空格,避免因格式问题导致匹配失败,这也是最稳妥的方式。
方法2:使用LIKE配合ANY(适合格式规范的场景)
如果地址格式统一,没有类似Street A1这类易混淆的内容,可以用这种更简洁的写法:
DECLARE @street TABLE (col NVARCHAR(50)) INSERT INTO @street VALUES ('Street A'), ('Street B') SELECT * FROM YourTable WHERE Adresses LIKE '%' + ANY(SELECT col FROM @street) + '%'
内容的提问来源于stack exchange,提问作者PeterXO
相关产品推荐
相关产品推荐

