sql >> Database teknologi >  >> RDS >> PostgreSQL

Sletning af poster med tal, der gentager mere end 5

OK, så logikken her kan opsummeres som:

  • Find den længste række af det samme fortløbende ciffer i et givet tal; og
  • Returner sand, hvis den længste værdi er> 5 cifre

Ikke?

Så lad os opdele det i rækker af på hinanden følgende cifre:

regress=> SELECT regexp_matches('666666689', '(0+|1+|2+|3+|4+|5+|6+|7+|8+|9+)', 'g');
 regexp_matches 
----------------
 {6666666}
 {8}
 {9}
(3 rows)

filtrer derefter i det længste:

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)

... men egentlig er vi ligeglade med det, bare hvis en post er længere end 5 cifre, så:

SELECT x[1] 
FROM regexp_matches('6666666898', '(0+|1+|2+|3+|4+|5+|6+|7+|8+|9+)', 'g') x 
WHERE length(x[1]) > 5;

kan bruges som en EXISTS test, f.eks.

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
)

hvilket faktisk er ret effektivt og returnere det korrekte resultat (altid rart). Men det kan forenkles lidt mere med:

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;
)

Du kan bruge den samme WHERE klausul i en DELETE .



  1. Hvordan opdeler man en række i flere rækker med en enkelt forespørgsel?

  2. Tilføjelse af en ny værdi til en eksisterende ENUM-type

  3. Få træsti i MySQL-tabel

  4. PHP Cookie for at holde brugeren logget ind - er dette sikkert nok?