大家都想提高自己的SQL能力,但是SQL能力也是需要慢慢提高的,为了让大家的SQL有所提高,特整理了下面的SQL。
需求:如下所示,有从1开始的2的幂的数组
- - 1, 2, 4, 8, 16, 32, 64, 128
想求出如下结果,如,输入17 在上面的数组中应得出
例:
输入值 17 : 1 + 16
输入值 31 : 1 + 2 + 4 + 16
输入值 32 : 32
想实现如上功能,首先我们需要得出比起特定输入值小的特定数组
这里我们用Oracle 提供的connect by 来实现
从上的SQL中我们已经实现了,但是我们需要的是:有从1开始的2的幂的数组
也是就是 POWER(2, LEVEL - 1)
但是行数16行显然有很多没必要的值,我们需要加大跳跃步数
现在已经求出了 如上述所示的结果 , 现在我们就剩下怎样把1,16 得出
Oracle 给我们提供了 BITAND 函数,是用来比较两个二进制数与运算(AND运算)
下面是 网上查到的 bitand 函数的用法和案例
bitand( ) 函数
返回两个数值型数值在按位进行 AND 运算后的结果。
语法
BITAND(nExpression1, nExpression2)
参数
nExpression1, nExpression2
指定按位进行 AND 运算的两个数值。如果 nExpression1 和 nExpression2 为非整数型,那 么它们在按位进行 AND 运算之前转换为整数。
返回值类型
数值型
说明 BITAND( ) 将 nExpression1 的每一位同 nExpression2 的相应位进行比较。如果 nExpression1 和 nExpression2 的位都是 1,相应的结果位就是 1;否则相应的结果位是 0。
下表列出对 nExpression1 和 nExpression2 按位进行 AND 运算的结果:
nExpression1 位 nExpression2 位 结果位
bitand( ) 函数示例
x = 5 && 二进制为 0101
y = 6 && 二进制为 0110
bitand(x,y) && 返回值 4,二进制为 0100
现在的情况下只要求出大于0的部分就可以了
整理之后如下
虽然这种SQL 比较复杂,但是因为有网络的存在我们可以搜集类似这样的SQL,万一以后我们能用的上呢。
谢谢大家, 欢迎转发!
我是知数堂SQL优化班老师-郑松华
如有关于SQL优化方面疑问需要交流的,请加入QQ群(579036588),并@骑龟的兔子 就可与我联系。
![640](https://i-blog.csdnimg.cn/blog_migrate/17394a37b4af418dcde3a95d998d43d3.png)
扫码报名
2019.7.18 20:30
《如何制定SQL“减脂计划”》
END
![分割线箭头动态 640?wx_fmt=gif](https://i-blog.csdnimg.cn/blog_migrate/e2788fc1ebab90bf64d8f4b5f30360fc.gif)
扫码加入MySQL的技术Q群
(群号:579036588)