ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

SQL 位运算实战:用 一个字段搞定多条件匹配

SQL 位运算实战:用  一个字段搞定多条件匹配 需求举例某动物园对动物的投喂有以下规定苹果可以去投喂鹿、猴子、熊猫竹子可以去投喂熊猫、竹鼠树叶可以去投喂兔子、鹿现在饲养员携带苹果、树叶他可以投喂哪些动物分析上述情景中饲养员、动物针对投放的食物在多种条件下匹配且最少有一项符合条件就确认投喂位运算 简单回顾 的用法按位“与”操作符如果两个数的二进制相同位数都是1则改位结果为1否则是0。以下举例int a 5; int b 4; 5的二进制0000 0000 0000 0101 4的二进制0000 0000 0000 0100 a b 0000 0000 0000 0100 0000 0000 0000 0100 4 //转为十进制是4借助 mysql支持位运算的操作逻辑如SELECT * FROM table WHERE a 5 ?;回到上面的需求假设我们使用位运算,可以让苹果代表个位、竹子代表十位、树叶就代表百位二进制下由于二进制下每一位只有0和1的值那么可以规定该动物允许投喂这种食物赋值1不允许投喂就赋值0。以鹿为例吃苹果、不吃竹子、吃树叶,则用二进制表示为1011 0 1 吃树叶 不吃竹子 吃苹果保存数据库时101就是鹿的喂食数据将二进制转为十进制101 — 5,即保存鹿信息时有一个食物的字段的数据为5上面的需求要去查询允许投喂苹果、树叶的动物做条件筛选时请求会携带着要查询食物参数那么该请求参数先进行处理为101同上面的方式- 5那么我们可以把 {food:5} 放入请求中后台接收处理现在我们一个个比较下各动物的投食数据鹿的食物信息为 101 - 5猴子的食物信息 100 - 4熊猫的食物信息 110 - 6竹鼠的食物信息 010 - 2兔子的食物信息 001 - 1菜单鹿猴子熊猫竹鼠兔子数据运算5 54 56 52 51 5转为二进制101 101100 101110 101010 101001 101运算结果101100100000001转十进制54401从上面的结果可以得出唯一不符合条件的动物为竹鼠其经过位运算后的值是0其他只要存在符合项就要大于0。SQL应为SELECT name FROM zoo_animal WHERE food 5 0;即可查寻出所有的符合条件的动物变更全部符合假如现在需求更改必须是确定这个动物既吃苹果又吃树叶才允许投递必须条件一致不多不少那么改为SELECT name FROM zoo_animal WHERE (food 5) 5;条件规则新增现在又多了一种食物比如香蕉现在动物信息表中所有的数据都是基于苹果、竹子、树叶所整合出来的如何做到最小的变动我们可以让每一次新增的食物的位放到最前面现在就是千位上代表香蕉因为新添加的食物不会出现在原本的动物身上所以原本的动物就变成了鹿 0101 - 5 猴子: 0100 - 4 熊猫的食物信息: 0110 - 6 竹鼠的食物信息: 0010 - 2 兔子的食物信息: 0001 - 1我们知道在位数前面加0是不会更改数值的如果运行原本动物吃香蕉只需走重新维护动物信息的请求即可删除删除不同于添加删除的数据没有确定性假如我们现在删除了竹子的信息那么所有的食物信息都会出现差错所以我们需要做一个规则的重建即删除掉某一个信息时应该重新把动物的食物信息重新按规则构建鹿 11 - 3 猴子: 10 - 2 熊猫的食物信息: 10 - 2 竹鼠的食物信息: 00 - 0 兔子的食物信息: 01 - 1修改修改同删除但实际场景出现的可能性较少自我感觉应该没人会去调整食物的排列顺序
返回列表