有趣的SQL(一)

大家都想提高自己的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

扫码报名

640?wx_fmt=png

2019.7.18 20:30

《如何制定SQL“减脂计划”》



END




640?wx_fmt=png

640?wx_fmt=png



640?wx_fmt=gif


扫码加入MySQL的技术Q群

(群号:579036588)

   

640?wx_fmt=jpeg



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值