利用|、&快速多类型过滤
实际开发中我们经常会遇到根据类型筛选的功能,如下图所示,一般在后台处理中会根据选择的类型进行查询
但是有时会遇到被筛选结果中包含多个标签类型,这样就无法使用简单的标签匹配筛选了,这里分享一种效率较高的查询方式
创建标签数字生成器
ps: 示例代码使用的typescript,其他语言逻辑类似
/**
* @param ifTag 标签数组
*/
private CovtagTobit(ifTags: IFileTag[]): number {
let tagBitSetnum = 0
if (typeof ifTags !== "object") {
this.logger.error(ifTags)
return
}
ifTags?.forEach(ifTag => {
//tagBitSet 的值应为2^n
let tagBitSet = 0
switch (ifTag.type) {
case "TYPE1": {
// 标签1
tagBitSet = 1
break
}
case "TYPE2": {
// 标签2
tagBitSet = 2
break
}
case "TYPE3": {
// 标签3
tagBitSet = 4
break
}
case "TYPE4": {
// 标签4
tagBitSet = 8
break
}
case "TYPE5": {
// 标签5
tagBitSet = 16
break
}
case "TYPE6": {
// 标签6
tagBitSet = 32
break
}
default: {
this.logger.error(ifTag.type, "标签类型转换传参不正确,应为...")
}
}
tagBitSetnum = tagBitSetnum | tagBitSet
})
return tagBitSetnum
}
如果有代码相关问题可以打开F12控制台实验相关内容
多种类型经过CovtagTobit
方法会生成一个数字,比如TYPE1、TYPE2、TYPE3
将7这个数字存储到数据库某一字段中,这个数字即为类型的转换值
查询结果
前台搜索时,用同样的方法再次计算一次Bit值
示例: 比如想要查询 TYPE1、TYPE2
将计算出的3传入查询条件调用中
具体的SQL查询伪代码,将查出所有包含TYPE1、TYPE2
的结果
# tagbit是结果的存储字段(上方示例中7的存储位置)
select * from table1 where (tagbit & 3) != 0
注: 转载请标明出处,如有错误还望不吝赐教
技术是死的,人是活的,问题是明确的,不要因为技术而技术,技术是为了解决问题