OK, vì vậy logic ở đây có thể được tóm tắt là:
- Tìm chuỗi dài nhất của cùng một chữ số liên tiếp trong bất kỳ số nào đã cho; và
- Trả về true nếu giá trị dài nhất đó> 5 chữ số
Đúng không?
Vì vậy, hãy chia nó thành một chuỗi các chữ số liên tiếp:
regress=> SELECT regexp_matches('666666689', '(0+|1+|2+|3+|4+|5+|6+|7+|8+|9+)', 'g');
regexp_matches
----------------
{6666666}
{8}
{9}
(3 rows)
sau đó lọc lâu nhất:
regress=>
SELECT x[1]
FROM regexp_matches('6666666898', '(0+|1+|2+|3+|4+|5+|6+|7+|8+|9+)', 'g') x
ORDER BY length(x[1]) DESC
LIMIT 1;
x
---------
6666666
(1 row)
... nhưng thực sự, chúng tôi không thực sự quan tâm đến điều đó, chỉ cần bất kỳ mục nhập nào dài hơn 5 chữ số, vì vậy:
SELECT x[1]
FROM regexp_matches('6666666898', '(0+|1+|2+|3+|4+|5+|6+|7+|8+|9+)', 'g') x
WHERE length(x[1]) > 5;
có thể được sử dụng như một EXISTS
kiểm tra, ví dụ:
WITH blah(n) AS (VALUES('999999969'),('000000089'),('666666689'),('15552555'))
SELECT n
FROM blah
WHERE EXISTS (
SELECT x[1]
FROM regexp_matches(n, '(0+|1+|2+|3+|4+|5+|6+|7+|8+|9+)', 'g') x
WHERE length(x[1]) > 5
)
mà thực sự là khá hiệu quả và trả về kết quả chính xác (luôn luôn tốt đẹp). Nhưng nó có thể được đơn giản hóa hơn một chút với:
WITH blah(n) AS (VALUES('999999969'),('000000089'),('666666689'),('15552555'))
SELECT n
FROM blah
WHERE EXISTS (
SELECT x[1]
FROM regexp_matches(n, '(0{6}|1{6}|2{6}|3{6}|4{6}|5{6}|6{6}|7{6}|8{6}|9{6})', 'g') x;
)
Bạn có thể sử dụng cùng một WHERE
mệnh đề trong DELETE
.