利用|、&快速多类型过滤

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

创建标签数字生成器

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

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

posted @ 2021-02-25 10:56  tsvico  阅读(151)  评论(0编辑  收藏  举报