sql >> データベース >  >> RDS >> PostgreSQL

繰り返し番号が5を超えるレコードを削除する

    OK、ここでのロジックは次のように要約できます:

    • 任意の番号で同じ連続する数字の最長のシリーズを検索します。および
    • 最長値が5桁を超える場合はtrueを返します

    そうですか?

    それでは、それを一連の連続した数字に分割しましょう:

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

    次に、最長のものをフィルタリングします:

    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)
    

    ...しかし実際には、エントリが5桁より長い場合でも、実際には気にしません。

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

    EXISTSとして使用できます テスト、例:

    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
    )
    

    これは実際にはかなり効率的で、正しい結果を返します(常に素晴らしい)。ただし、次の方法でもう少し簡略化できます。

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

    同じWHEREを使用できます DELETEの句 。



    1. 列の値に従って行をN回繰り返す

    2. AWSEC2からAWSRDSへのOracleデータベースの移行、パート4

    3. 複数テーブルのDELETELIMIT

    4. 現在のコマンドで重大なエラーが発生しました。結果がある場合は、破棄する必要があります。 SQL Azureエラーはどういう意味ですか?