首页 新闻 会员 周边

sqlserver查询

0
悬赏园豆:60 [已解决问题] 解决于 2014-11-28 09:41

配置表的意思为,比如#FF0000,它可以算作是红色,也可以算作是橘色。

比如我添加2个查询颜色:红色+橘色  那么查询表中的选择为:必须要有红色和橘色,这里占用2个字段,其他字段有可能能为空,如果不为空的情况下,那其他三个只要是这两个就行。满足类似这种情况

红色 橘色 橘色 橘色 橘色 、、、、、、橘色橘色橘色红色 、、、、橘色红色、、、红色橘色。(无顺序)

光明中的黑手的主页 光明中的黑手 | 初学一级 | 园豆:135
提问于:2014-11-27 14:28
< >
分享
最佳答案
1

如果不考虑效率,我会这样去写:

create function fn_GetColorsByCode(@code varchar(10))
returns varchar(20)
as
begin
    declare @colors varchar(20)
    select top 1 @colors IsNULL(COne,'')+IsNull(CTwo,'')
    from 配置表
    where Code = @code
    return @colors
end
    

select * from (
select *,colors=(fn_GetColorsByCode(t.ChildColor1) + fn_GetColorsByCode(t.ChildColor2) + fn_GetColorsByCode(t.ChildColor3) + fn_GetColorsByCode(t.ChildColor4) + fn_GetColorsByCode(t.ChildColor5)) from Table t
) as t1
where t1.colors like '%红色%' and t1.colors like '%橘色%'


记事本的,没测试,大概就是这个意思。
收获园豆:60
幻天芒 | 高人七级 |园豆:37175 | 2014-11-27 14:56

你这里的cone+ctwo处理是不对的,因为它是一个or的概念。满足其一,另一满足为下个字段满足。

光明中的黑手 | 园豆:135 (初学一级) | 2014-11-27 15:33

比如一条数据是:ChildColor1:#6F9191(青色 灰色)ChildColor2:#77A0BB(蓝色 灰色)ChildColor3:#667B99(蓝色 灰色)。    然后这条数据应该怎样被查询到呢,应该是添加(青色,蓝色)or (灰色,蓝色)  or (灰色) or (青色,灰色) or (青色,灰色,蓝色)。这样可能有点乱,它是个由上至下的概念。如图。

光明中的黑手 | 园豆:135 (初学一级) | 2014-11-27 15:43

@光明中的黑手: 这也简单,你把每个函数里的连接符和colors的连接符分开设置即可。

幻天芒 | 园豆:37175 (高人七级) | 2014-11-28 08:37

@幻天芒: 谢谢!我解决了,我把这种组合全部穷举出来,然后写入另一张表,用位计算去存储他们,这样性能应该不会差。

光明中的黑手 | 园豆:135 (初学一级) | 2014-11-28 09:41

@光明中的黑手: 数据量较大的时候,穷举有点麻烦。效率不会成为瓶颈。

幻天芒 | 园豆:37175 (高人七级) | 2014-11-28 10:40

@幻天芒: 数据大的是记录表,本身文字颜色不大,就13种(红色白色...),而后记录表使用颜色code为248种(#ffffff...),字段为5个,每个字段是248种颜色,而每种颜色对应2个文字颜色。  最多的一行数据也就2的5次方组合。所以数据也不算多。

光明中的黑手 | 园豆:135 (初学一级) | 2014-11-28 22:58

@光明中的黑手: 不多就好,还可以用一个函数来做匹配 ,类似于int fun(col1,col2) ,匹配了就返回1,然后5个这样的函数求和,大于等于2即可。

幻天芒 | 园豆:37175 (高人七级) | 2014-11-29 08:33
其他回答(1)
0

你是做的电子商务网站吗?

king2003 | 园豆:161 (初学一级) | 2014-11-27 15:03

不是,是个应用

支持(0) 反对(0) 光明中的黑手 | 园豆:135 (初学一级) | 2014-11-27 15:43
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册