原标题:有趣的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> select level from dual connect by level < 17;

LEVEL

----------

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

16 rows selected.

从上的SQL中我们已经实现了,但是我们需要的是:有从1开始的2的幂的数组

也是就是 POWER(2, LEVEL - 1)

SQL> select level ,POWER(2, LEVEL - 1) x from dual connect by level < 17;

LEVEL X

---------- ----------

1 1

2 2

3 4

4 8

5 16

6 32

7 64

8 128

9 256

10 512

11 1024

12 2048

13 4096

14 8192

15 16384

16 32768

16 rows selected.

但是行数16行显然有很多没必要的值,我们需要加大跳跃步数

SQL> select 17 ,POWER(2, LEVEL - 1) x from dual connect by POWER(2, LEVEL - 1) <= 17;

17 X

---------- ----------

17 1

17 2

17 4

17 8

17 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

SQL> select 17 ,POWER(2, LEVEL - 1) x ,bitand(17,POWER(2, LEVEL - 1) ) xy from dual connect by POWER(2, LEVEL - 1) < 17;

17 X XY

---------- ---------- ----------

17 1 1

17 2 0

17 4 0

17 8 0

17 16 16

现在的情况下只要求出大于0的部分就可以了

SQL> select x from (

2 select 17 ,POWER(2, LEVEL - 1) x ,bitand(17,POWER(2, LEVEL - 1) ) xy from dual connect by POWER(2, LEVEL - 1) <= 17

3 )where xy >0;

X

----------

1

16

整理之后如下

SQL> SELECT x

2 , POWER(2, LEVEL - 1) y

3 FROM (SELECT 17 x FROM dual)

4 WHERE BITAND(x, POWER(2, LEVEL - 1)) > 0

5 CONNECT BY POWER(2, LEVEL - 1) <= x;

X Y

---------- ----------

17 1

17 16

SQL> SELECT x

2 , POWER(2, LEVEL - 1) y

3 FROM (SELECT 31 x FROM dual)

4 WHERE BITAND(x, POWER(2, LEVEL - 1)) > 0

5 CONNECT BY POWER(2, LEVEL - 1) <= x;

X Y

---------- ----------

31 1

31 2

31 4

31 8

31 16

SQL>

SQL> SELECT x

2 , POWER(2, LEVEL - 1) y

3 FROM (SELECT 32 x FROM dual)

4 WHERE BITAND(x, POWER(2, LEVEL - 1)) > 0

5 CONNECT BY POWER(2, LEVEL - 1) <= x

6 ;

X Y

---------- ----------

32 32

虽然这种SQL 比较复杂,但是因为有网络的存在我们可以搜集类似这样的SQL,万一以后我们能用的上呢。

谢谢大家, 欢迎转发!

我是知数堂SQL优化班老师-郑松华

如有关于SQL优化方面疑问需要交流的,请加入QQ群(579036588),并@骑龟的兔子就可与我联系。

扫码报名

2019.7.18 20:30

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

END

扫码加入MySQL的技术Q群

(群号:579036588)返回搜狐,查看更多

责任编辑:

mysql bitand函数_有趣的SQL(一)相关推荐

  1. mysql开窗函数_魔幻的SQL开窗函数,为您打开进阶高手的一扇天窗

    经常写SQL脚本的朋友,通常会有一种迷之自信,似乎各种问题都有自己的一套解决方案.时间长了,人的思维可能会逐渐固化.思维固化能提高工作效率,但从某些角度看是很可怕的,我们也同时会失去接受新知识的内在动 ...

  2. mysql var函数_请问关于sql里的var函数是干什么的?

    慕侠2389804 聚合函数是对一组值执行计算并返回单一的值的函数,它经常与SELECT语句的GROUP BY子句一同使用,SQL SERVER 中具体有哪些聚合函数呢?我们来一一看一下:AVG  返 ...

  3. mysql 复杂行转列_有趣的SQL(四) 行转列的复杂应用和优化思想

    原标题:有趣的SQL(四) 行转列的复杂应用和优化思想 导读 本文节选自松华老师<SQL优化专栏> 大家好,我是知数堂SQL 优化班老师 网名:骑龟的兔子 在之前的的系列文章:有趣的SQL ...

  4. mysql geo 函数_地理位置geo处理之mysql函数

    目前越来越多的业务都会基于LBS,附近的人,外卖位置,附近商家等等,现就讨论离我最近这一业务场景的解决方案. 原文:https://www.jianshu.com/p/455d0468f6d4 目前已 ...

  5. mysql geo 函数_【后端开发】地理位置geo处理之mysql函数的详细介绍(附代码)

    本篇文章给大家带来的内容是关于地理位置geo处理之mysql函数的详细介绍(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 目前越来越多的业务都会基于LBS,附近的人,外卖位 ...

  6. mysql 本周函数_【转】MySQL时间函数的使用:查询本周、下周、本月、下个月份的数据...

    MySQL时间函数的使用:查询本周.上周.本月.上个月份的数据[转] /*今天*/ select * from 表名 where to_days(时间字段) = to_days(now()); /*昨 ...

  7. sql dateadd函数_什么是SQL Server DATEADD()函数?

    sql dateadd函数 Hey, folks! In this article, we will be focusing on SQL Server DATEADD() function in d ...

  8. mysql sql总计函数_请问select SQL 语言中常用的合计函数有哪些?

    1.sql中sum和count的区别 ----sql聚合函数 (1)首先,sum是对一个字段求和,hive中字段的类型一般是string或者是int,如果是int当然没有问题,如果是string类型但 ...

  9. mysql 复杂行转列_有趣的SQL(4) 行转列的复杂应用和优化思想

    大家好,我是知数堂SQL 优化班老师 网名:骑龟的兔子 在之前的的系列文章中,有意思的SQL(3) 行转列,列转行和复制 已经给大家介绍了,行转列,列转行,复制等方法. 在这篇文章中,对其进行更深一层 ...

最新文章

  1. nvidia-jetson系列硬件平台上安装Qt
  2. Scrum指南新版发布,再添新概念—Product Goal
  3. 波卡链Substrate (4)托盘Pallets
  4. map内置函数分析所得到的思路
  5. C#设计模式之14-命令模式
  6. js对象与this指向
  7. window.open('') 火狐,IE事件冒泡处理,点击事件冒泡处理
  8. 怎么才能免费下载CSDN资源
  9. 暑期读书月开幕式暨天一寻宝活动
  10. 2022.3.14-3.20 AI行业周刊(第89期):商业计划书
  11. 使用Syncthing文件同步工具在两台Windows server服务器实现文件同步(实战)
  12. 路由器下一跳地址怎么判断_路由器工作原理(一)
  13. 【CSS】span标签设置宽度
  14. ctf比赛涉及的方面以及所需知识
  15. AES算法中S盒的FPGA实现 II
  16. 动物拼图代码html,制作动物拼图美术教案
  17. 小红书百万博主如何炼成?美妆博主专访
  18. 看linux centos版本信息,Linux CentOS查看操作系统版本信息
  19. Android 事件分发机制分析及源码详解
  20. 最全4k,8k的高清壁纸网站免费下载

热门文章

  1. 收藏这套模板,你也能10分钟制作一张数据地图!
  2. 【专业扫盲】模拟集成电路的具体方向
  3. 王垠:我和权威的故事
  4. 六级核心词汇151~200
  5. 小程序注册安装以及新手快速入门教程
  6. 【软件质量】软件互操作性
  7. 基于语义分割实现人脸图像的皱纹检测定位与分割
  8. 注册岩土工程师专业考试终于过了
  9. 在ubuntu上安装nodebb
  10. 4款优秀的开源的考试系统