You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server中如何筛选包含指定街道的聚合行?

问题

我在SQL Server中有一张包含聚合地址列的表,结构如下,需要筛选出所有包含Street A或Street B的行:

NameAdresses
MikeStreet A, Street B, Street C
SmithStreet B
JimmyStreet 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 )

预期的正确结果集是:

NameAdresses
MikeStreet A, Street B, Street C
SmithStreet 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 19:40:26