mysql中若存在一个表,存在一个属性a,a中可能包含集合'2', '4', '8','16','32','64','128','256','512','8192','1024', '2048','4096','16384','32768','65536', '131072','262144','524288','1048576','2097152','4194304', '33','34','31',现需要统计属性a中出现集合中一个或一个以上的数字和以上字符相同的行数, 只要出现不相同的数字就不参与统计
时间: 2023-07-28 07:06:33 浏览: 207
可以使用 MySQL 中的正则表达式和位运算来实现此需求。首先,将集合中的数字转换成二进制数,然后将每个二进制数转换成对应的位,如下所示:
| 集合中的数字 | 二进制数 | 对应的位 |
|--------------|----------|----------|
| 2 | 10 | 第二位 |
| 4 | 100 | 第三位 |
| 8 | 1000 | 第四位 |
| 16 | 10000 | 第五位 |
| 32 | 100000 | 第六位 |
| 64 | 1000000 | 第七位 |
| 128 | 10000000 | 第八位 |
| 256 | 100000000| 第九位 |
| 512 | 1000000000|第十位 |
| 1024 | 10000000000|第十一位|
| 2048 | 100000000000|第十二位|
| 4096 | 1000000000000|第十三位|
| 8192 | 10000000000000|第十四位|
| 16384 | 100000000000000|第十五位|
| 32768 | 1000000000000000|第十六位|
| 65536 | 10000000000000000|第十七位|
| 131072 | 100000000000000000|第十八位|
| 262144 | 1000000000000000000|第十九位|
| 524288 | 10000000000000000000|第二十位|
| 1048576 | 100000000000000000000|第二十一位|
| 2097152 | 1000000000000000000000|第二十二位|
| 4194304 | 10000000000000000000000|第二十三位|
然后,使用正则表达式来匹配包含集合中任意一个或多个数字的行,如下所示:
```mysql
SELECT COUNT(*) FROM table_name WHERE a REGEXP '^[^2]*2?[^2]*$|^[^4]*4?[^4]*$|^[^8]*8?[^8]*$|^[^16]*16?[^16]*$|^[^32]*32?[^32]*$|^[^64]*64?[^64]*$|^[^128]*128?[^128]*$|^[^256]*256?[^256]*$|^[^512]*512?[^512]*$|^[^1024]*1024?[^1024]*$|^[^2048]*2048?[^2048]*$|^[^4096]*4096?[^4096]*$|^[^8192]*8192?[^8192]*$|^[^16384]*16384?[^16384]*$|^[^32768]*32768?[^32768]*$|^[^65536]*65536?[^65536]*$|^[^131072]*131072?[^131072]*$|^[^262144]*262144?[^262144]*$|^[^524288]*524288?[^524288]*$|^[^1048576]*1048576?[^1048576]*$|^[^2097152]*2097152?[^2097152]*$|^[^4194304]*4194304?[^4194304]*$|^[^31]*31?[^31]*$|^[^33]*33?[^33]*$|^[^34]*34?[^34]*$';
```
此查询将返回属性 a 中包含集合中任意一个或多个数字的行数。其中,正则表达式使用了位运算的概念,例如 `^[^2]*2?[^2]*$` 表示匹配不包含数字 2 的字符串或包含数字 2 并且不包含其他数字 2 的字符串。其他正则表达式的含义可以参考类似的解释。
阅读全文