利用、& 快速多类型过滤

实际开发中我们经常会遇到根据类型筛选的功能,如下图所示,一般在后台处理中会根据选择的类型进行查询
多类型选择
但是有时会遇到被筛选结果中包含多个标签类型,这样就无法使用简单的标签匹配筛选了,这里分享一种效率较高的查询方式

多个类型

创建标签数字生成器

ps: 示例代码使用的 typescript,其他语言逻辑类似

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
/**
* @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 的结果

1
2
# tagbit是结果的存储字段(上方示例中7的存储位置)
select * from table1 where (tagbit & 3) != 0

注:转载请标明出处,如有错误还望不吝赐教