在SQL查询中选择对数

时间:2019-07-06 10:36:57

标签: mysql sql

数据库:

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

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

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

但是我使用的方式不是很干净的方法。

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

结果将是:

  

0050000235、5532003644、1122330505、1103220311和1103000011

3 个答案:

答案 0 :(得分:1)

使用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 

请参见demo
结果:

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

答案 1 :(得分:1)

where Number rlike '((00|11|22|33|44|55|66|77|88|99).*){3}'

答案 2 :(得分:0)

使用正则表达式如何?

where number regexp '00.*00.*00'

或更短:

where number regexp '(00.*){3}'

您可以轻松地将其概括为任意两个数字:

where number regexp '([0-9]{2}.*){3}'

如果您想确保恰好六个'0'(而不是六个):

where number regexp '^[^0]*00[^0]*00[^0]*00[^0]*$'