sql >> Databasteknik >  >> RDS >> PostgreSQL

Ta bort poster med nummer som upprepas mer än 5

OK, så logiken här kan sammanfattas som:

  • Hitta den längsta serien av samma på varandra följande siffra i ett givet nummer; och
  • Returnera sant om det längsta värdet är> 5 siffror

Visst?

Så, låt oss dela upp det i serier av på varandra följande siffror:

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

filtrera sedan längst:

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 egentligen bryr vi oss inte om det, bara om någon post är längre än 5 siffror, 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 användas som en EXISTS testa, t.ex.

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
)

vilket faktiskt är ganska effektivt och ger rätt resultat (alltid trevligt). Men det kan förenklas lite mer 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 använda samma WHERE sats i en DELETE .



  1. MySQL-fråga för flera kryssrutor

  2. Autentiseringspluginfel vid anslutning till MySQL-databas

  3. Kan SQL*Plus läsa miljövariabler från den maskin som den körs på?

  4. hur man beräknar tiden som spenderas på min app efter tidsstämpel