sql >> Database >  >> RDS >> PostgreSQL

Records verwijderen waarvan het nummer meer dan 5 . herhaalt

OK, dus de logica hier kan worden samengevat als:

  • Zoek de langste reeks van hetzelfde opeenvolgende cijfer in een bepaald getal; en
  • Retourneer true als die langste waarde> 5 cijfers is

Toch?

Laten we het dus opsplitsen in reeksen van opeenvolgende cijfers:

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

filter dan het langst:

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)

... maar dat interesseert ons eigenlijk niet, alleen als een invoer langer is dan 5 cijfers, dus:

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 worden gebruikt als een EXISTS testen, bijv.

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
)

wat eigenlijk best efficiënt is en het juiste resultaat oplevert (altijd leuk). Maar het kan een beetje meer worden vereenvoudigd met:

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

Je kunt dezelfde WHERE . gebruiken clausule in een DELETE .



  1. DB2-database in Oracle SQL-ontwikkelaar

  2. bel extern script met mySQL-trigger WHITOUT sys_exec op ubuntu ARMHF

  3. ORACLE (11.2.0.1.0) - Recursieve CTE met een datumuitdrukking

  4. Snel zoeken in de buurt van gebruikers met PostGIS