2017-12-13 3 views
3

私はSQLで新しいです。私はデータベース(Postgres)からデータを取得しようとしていて、それらが有効でない場合はそれらを即座に置き換えようとしています。純粋なSQLを使用してこれを行うことは可能ですか?電話番号は、8または7から始まりオンザフライでデータのSELECTとREPLACE(クリーン) -

  1. :場合、私は最後の10桁の数字を取得したいのですが

    |phone   | 
    ------------------ 
    |+79844533324 | 
    |893233314215 | 
    |dfgdhf   | 
    |45    | 
    |+    | 
    |    | 
    |(345)53326784457| 
    |8(123)346-34-45 | 
    
    etc.. 
    

    :たとえば、私のDB usersに私は次のようなデータを持つフィールドphoneを持っています+7または+8。

  2. 数は10桁、このような8または7または7または8以上でないと、以下

後に含まれています。私はそれがSQLのために複雑になるかもしれないと思い

|phone   | 
------------------ 
|9844533324  | 
|1233463445  | 

。私は大量のマニュアルを研究しましたが、それらのほとんどは正規表現でSELECTをカバーしています。

+0

は、同様に期待された結果を指定します。 – jarlh

+0

正規表現を使用してください。それでも問題が解決しない場合は、必要な方法でデータをマッサージする関数をPL/pgSQLまたはPL/Perlに記述します。 –

答えて

1

私は、これはうまくいくかもしれないと思う:説明のように

select 
    right (regexp_replace (phone, '\D', '', 'g'), 10) 
from foo 
where 
    phone ~ '^\+?[78]' and 
    regexp_replace (phone, '\D', '', 'g') ~ '^[78]\d{10}$' 

right (regexp_replace (phone, '\D', '', 'g'), 10) 

は、フィールドからすべての非数字を削除してから、右10個の文字を取る - それは唯一の意志

phone ~ '^\+?[78]' and 

電話機はオプションの「+」で始まり、次の条件を満たす場合に実行します。その後、7または8

regexp_replace (phone, '\D', '', 'g') ~ '^[78]\d{10}$' 

そして、すべての非数字を剥奪フィールドは、ちょうど10他の数字が続く7または8で始まります。

結果:そのテーブルのデータで

9844533324 
1233463445 
関連する問題