我的表结构是这样的
这是客户表中的三个基本字段其实用到也就F45_T025 它是个标签字段 里边儿存储的是管理员对会员打标签时输入的内容 一次可以打几个 标签之间是以逗号隔开 比如说第二条字段有两个标签为:好客户和月消费2000中间以逗号隔开 现在需求是 当我搜索是比如我在文本框中输入 tag,月消费2000 的话 F45_T025 字段中只要包含 tag 和 月消费2000其中一个的标签全部显示。
现在我的解决方案是使用UNION ALL
select OID_T025,F5_T025,F45_T025 from T_025 where OID_T025 in( select OID_T025 from T_025 where 'tag' in (select short_str from dbo.split(F45_T025,',')) union all
select OID_T025 from T_025 where '月消费2000' in (select short_str from dbo.split(F45_T025,',')))
其中dbo.split 是一个函数 也就是当你传入一个以逗号分割的字符串时它会帮你分割为表 比如我写 select * from dbo.split('123,2,4',',') 执行后 返回为
而我这样写的话在cs代码中处理就比表繁琐
string[] ts = cusName.Split(',');
if (ts.Length > 1)
{
filter.Append(" AND OID_T025 in (select OID_T025 from (");
for (int i = 0; i < ts.Length - 1; i++)
{
filter.Append("select OID_T025 from T_025 where '" + ts + "' in (select short_str from dbo.split(F45_T025,',')) union all ");
}
filter.Append("select OID_T025 from T_025 where '" + ts[ts.Length - 1] + "' in (select short_str from dbo.split(F45_T025,','))");
filter.Append(") as tb)");
}
这样执行起来效率比较低 跪求好的解决方案 |