黑马程序员技术交流社区

标题: 工作中遇到的一个SQLSERVER查询问题 [打印本页]

作者: 刘建素    时间: 2012-7-22 11:56
标题: 工作中遇到的一个SQLSERVER查询问题
我的表结构是这样的   这是客户表中的三个基本字段其实用到也就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)");
                        }


这样执行起来效率比较低  跪求好的解决方案
作者: 许庭洲    时间: 2012-7-23 08:46
本帖最后由 许庭洲 于 2012-7-24 11:07 编辑

1,可在后台数据库里,新建一个存储过程PR_F45_T025来解决该SQL语句;
2,CREATE OR REPLACE PROCEDURE SCOTT." PR_F45_T025 " ( )
as
begin
--只要包含 tag 和 月消费2000其中一个的标签全部显示
--  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,',')))
);
  COMMIT;
end;




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2