Postgresql - 从子字符串中删除任何空格

时间:2015-01-19 14:55:48

标签: sql regex postgresql

如何从字符串的子字符串中删除任何空格?

例如,我有这个号码' +370 650 12345'。我需要所有数字都具有此格式country_code rest_of_the_number或在该示例中:+370 65012345。你怎么能用PostgreSQL实现呢?

我可以使用trim()函数,但它会删除所有空格。

3 个答案:

答案 0 :(得分:1)

假设该列名为phone_number

left(phone_number, strpos(phone_number, ' '))
   ||regexp_replace(substr(phone_number, strpos(phone_number, ' ') + 1), ' ', '', 'g')

它首先将所有内容都放到第一个空格,然后将其与从字符串的其余部分替换所有空格的结果连接起来。

如果您还需要处理其他空格而不仅仅是空格,则可以使用'\s'作为regexp_replace()

中的搜索值

答案 1 :(得分:0)

如果您能够假设国家/地区代码始终存在,则可以尝试使用正则表达式来捕获感兴趣的部分。假设您的电话号码存储在名为content的表中名为numbers的列中,您可以尝试以下内容:

SELECT parts[1] || ' ' || parts[2] || parts[3]
FROM (
  SELECT
    regexp_matches(content, E'^\\s*(\\+\\d+)\\s+(\\d+)\\s+(\\d+)\\s*$') AS parts
  FROM numbers
) t;

答案 2 :(得分:0)

即使国家/地区代码不存在(see SQL Fiddle Demo here),以下内容仍然有效:

SELECT TRIM(REPLACE(REPLACE(REGEXP_REPLACE('+370 650 12345', '^((\+\d+)\s+)?(.*)$', '\1|\3'), ' ', ''), '|', ' '));

返回:+370 65012345

SELECT TRIM(REPLACE(REPLACE(REGEXP_REPLACE('370 650 12345', '^((\+\d+)\s+)?(.*)$', '\1|\3'), ' ', ''), '|', ' '));

返回:37065012345

它在开头查找国家/地区代码(一组以+开头的数字),并使用管道|替换该代码后面的任何空格。然后它用空字符串替换结果字符串中的所有空格,然后用空格替换|的出现次数! |的选择是任意的,我想它可以是任何非数字字符。