动态选择和REPLACE(干净)数据 - SQL

时间:2017-12-13 10:24:57

标签: sql regex postgresql

我是SQL的新手。我正在尝试从数据库(Postgres)获取数据并在运行时替换它们,如果它们无效的话。使用纯SQL可以做到这一点吗?例如,在我的数据库users中,我有字段phone,其中包含以下数据:

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

etc..

如果符合以下条件,我只想获得最后十位数字:

  1. 电话号码从8或7或+7或+8开始。
  2. 数字包含8或7之后的十位数或+7或+8不多且不小于
  3. 像这样:

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

    我想这可能是复杂的SQL。我已经研究了大量的手册,但大多数手册只包括SELECT和regex条件。

1 个答案:

答案 0 :(得分:1)

我认为这可行:

U+0041

以解释的方式:

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)

手机以可选的“+”开头,然后是7或8

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

并且所有非数字字段都以7或8开头,后跟十个其他数字。

结果:

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