SQL Server单列多Generic_Code值的精准与模糊查询需求
在SQL Server中处理FAMPRD表逗号分隔Generic_Code列的两类查询
示例测试数据
假设FAMPRD表的Generic_Code列(varchar类型)有以下测试记录:
| Generic_Code |
|---|
| '00001' |
| '00001','00002' |
| '00001','00002','00034' |
| '00002','00052' |
| '00034','00052' |
1. 精准匹配查询:仅返回仅包含'00001'和'00002'的记录
需求:仅保留Generic_Code恰好包含'00001'和'00002'(无其他代码,顺序不影响)的记录。
方案1:字符串匹配(兼容所有SQL Server版本)
SELECT * FROM FAMPRD WHERE -- 确保同时包含两个目标代码 Generic_Code LIKE '%''00001''%' AND Generic_Code LIKE '%''00002''%' -- 排除包含其他5位数字代码的情况 AND Generic_Code NOT LIKE '%''000[0-9][0-9]''%' ESCAPE '\' -- 验证总长度符合仅两个代码的情况(去掉引号和逗号后长度为10) AND LEN(REPLACE(REPLACE(Generic_Code, '''', ''), ',', '')) = 10
方案2:使用STRING_SPLIT(SQL Server 2016及以上版本)
这种方式更严谨,避免字符串匹配的边界问题:
SELECT f.* FROM FAMPRD f CROSS APPLY STRING_SPLIT(REPLACE(f.Generic_Code, '''', ''), ',') s GROUP BY f.Generic_Code, f.列1, f.列2 -- 替换为表中实际存在的所有列 HAVING COUNT(DISTINCT s.value) = 2 AND MAX(CASE WHEN s.value = '00001' THEN 1 ELSE 0 END) = 1 AND MAX(CASE WHEN s.value = '00002' THEN 1 ELSE 0 END) = 1
预期结果
| Generic_Code |
|---|
| '00001','00002' |
2. 模糊匹配查询:返回包含'00001'或'00002'的所有记录
需求:只要Generic_Code中存在'00001'或'00002',无论是否包含其他代码,都返回。
SQL查询代码
SELECT * FROM FAMPRD WHERE Generic_Code LIKE '%''00001''%' OR Generic_Code LIKE '%''00002''%'
预期结果
| Generic_Code |
|---|
| '00001' |
| '00001','00002' |
| '00001','00002','00034' |
| '00002','00052' |
内容的提问来源于stack exchange,提问作者bonny
相关产品推荐
相关产品推荐

