sql >> Databáze >  >> RDS >> PostgreSQL

Mazání záznamů s číslem opakujícím se více než 5

OK, takže logiku zde lze shrnout takto:

  • Najděte nejdelší řadu stejné po sobě jdoucí číslice v libovolném daném čísle; a
  • Pokud je nejdelší hodnota> 5 číslic, vraťte hodnotu true

Správně?

Pojďme to tedy rozdělit na řadu po sobě jdoucích číslic:

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

pak filtrujte na nejdelší:

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)

... ale ve skutečnosti nás to nezajímá, pokud je jakýkoli záznam delší než 5 číslic, takže:

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

lze použít jako EXISTS test, např.

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
)

což je ve skutečnosti docela efektivní a vrátí správný výsledek (vždy pěkný). Ale dá se to ještě trochu zjednodušit pomocí:

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

Můžete použít stejné WHERE klauzule v DELETE .



  1. Funkce 'Upravit' pro příspěvky na fóru a podobně

  2. Proč iterace přes velký Django QuerySet spotřebovává obrovské množství paměti?

  3. Nelze se vzdáleně připojit k PostgreSQL na instanci Amazon EC2 pomocí PgAdmin

  4. Automatický přírůstek primárního klíče PostgreSQL se zhroutí v C++