首页 > 解决方案 > 在 SQL 查询中选择对号

问题描述

数据库:

+------------+
|   Number   |
+------------+
| 0050000235 |
+------------+
| 5532003644 |
+------------+
| 1122330505 |
+------------+
| 1103220311 |
+------------+
| 1103000011 |
+------------+
| 1103020012 |
+------------+

要选择具有一对“0”的数字,我尝试了 3 次:

SELECT * FROM numbers
WHERE Number LIKE "%00%00%00%"
    OR Number LIKE "%00%0000%"
    OR Number LIKE "%0000%00%"
    OR Number LIKE "0000%00%"
    OR Number LIKE "%00%0000"   
    OR Number LIKE "00%0000%"
    OR Number LIKE "%0000%00"
    OR Number LIKE "%0000%00"
    OR Number LIKE "%000000%" 
    OR Number LIKE "000000%"
    OR Number LIKE "%000000" 

这导致我:

0050000235

但是我使用的方式,我认为这不是一个干净的方法。

问题如何获取具有 3 对的数字使用干净的 SQL 查询

结果将是:

0050000235, 5532003644, 1122330505, 1103220311 & 1103000011

标签: mysqlsql

解决方案


使用 UNION ALL 创建从 0 到 9 的一系列数字并交叉连接到表。
这些数字中的每一个都将加倍并在表格的列中替换为空字符串。每个替换的长度差异将被求和,如果大于 6,则意味着至少存在 3 对:

select 
  n.number
from (
  select 0 d union all select 1 d union all select 2  union all 
  select 3 union all select 4 union all select 5 union all 
  select 6 union all select 7 union all select 8 union all select 9
) s cross join numbers n
group by n.number                     
having sum(
  length(n.number) - length(replace(n.number, repeat(d, 2), '')) 
) >= 6 

请参阅演示
结果:

| number     |
| ---------- |
| 0050000235 |
| 1103000011 |
| 1103220311 |
| 1122330505 |
| 5532003644 |

推荐阅读