数据库:
+------------+
| 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
答案 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]*$'