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

基于T1表NAME列多值筛选T2表匹配记录的SQL实现

嘿,我来帮你搞定这个SQL筛选的问题!要实现从T2表中找出NAMES列包含T1表NAME列任意值的记录,不同数据库有不同的实用方案,下面给你详细说明:

实现方案

1. MySQL/MariaDB 版本

MySQL自带的FIND_IN_SET函数刚好适配逗号分隔的字符串匹配场景,直接用它就能快速关联两张表:

SELECT t2.*
FROM T2 t2
JOIN T1 t1 ON FIND_IN_SET(t1.NAME, REPLACE(t2.NAMES, ' ', '')) > 0
GROUP BY t2.RNO, t2.NAMES;
  • 用REPLACE是为了清除NAMES列里可能存在的空格(比如Name1, Name5这种带空格的格式),确保匹配精准;
  • 加GROUP BY是为了避免T2的同一条记录被T1中多个匹配项重复输出。

2. PostgreSQL 版本

PostgreSQL可以把逗号分隔的字符串转成数组,再用ANY操作符做匹配,写法更直观:

SELECT t2.*
FROM T2 t2
WHERE EXISTS (
    SELECT 1
    FROM T1 t1
    WHERE t1.NAME = ANY(string_to_array(t2.NAMES, ','))
);

如果你不想用数组,也可以用通配符匹配的方式(注意处理边界,避免部分匹配的问题):

SELECT t2.*
FROM T2 t2
JOIN T1 t1 ON ',' || t2.NAMES || ',' LIKE '%,' || t1.NAME || ',%'
GROUP BY t2.RNO, t2.NAMES;

3. SQL Server 版本

SQL Server的STRING_SPLIT函数可以直接拆分逗号分隔的字符串,再和T1关联匹配:

SELECT DISTINCT t2.RNO, t2.NAMES
FROM T2 t2
CROSS APPLY STRING_SPLIT(t2.NAMES, ',') AS split
JOIN T1 t1 ON LTRIM(RTRIM(split.value)) = t1.NAME;
  • LTRIM(RTRIM)用来处理拆分后字符串两端的空格;
  • DISTINCT用来去重,保证每条T2记录只输出一次。

额外说明

如果你的数据存在大小写差异(比如T1里是NAME1,T2里是Name1),可以通过大小写转换来统一匹配规则:

  • MySQL/MariaDB:用LOWER(t1.NAME) = LOWER(...);
  • PostgreSQL:改用ILIKE替代LIKE,或者用LOWER转换;
  • SQL Server:使用COLLATE SQL_Latin1_General_CP1_CI_AS来开启大小写不敏感匹配。

这样就能完美得到你想要的结果啦,比如示例里RNO=3的记录因为Name2不在T1的NAME列中,会被自动排除。

内容的提问来源于stack exchange,提问作者Ram

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:14:14