从字符串中提取类型和 phone 数字

Extract type and phone number from string

我有一个 varchar 可以有这些值:

"Office: (415) 438-4437"
"Office: (602) 740-6409 Fred Cohen"
"Mobile: (707) 888-572"
"Phone: (707) 472-0982"

我需要将这些值分隔为 phone_type 和 phone 列。

看起来应该像这样

phone type phone
Office (415) 438-4437
Office (602) 740-6409
Mobile (707) 888-572
Phone (707) 472-0982

这是我的代码

select phone from core.person;

我可以在 phone 数字之后获得更多数据,但只需要选择字符串的第一个单词 phone_type 和 phone 即 (###) ###-####,怎么做?

可能很简单:

SELECT split_part(phone, ': ', 1)                  AS phone_type
     , rtrim(substring(phone, '\([\d\) -]+'))      AS phone
     , substring(phone, '\(\d{3}\) \d{3}-\d{3,4}') AS phone_strict
FROM   core.person;

db<>fiddle here

第二个变体更严格。 (但仍然不像你写的那样严格 (###) ###-####,这似乎是关于尾随 4 位数字的错误。)

我们也可以对 phone_type 使用正则表达式,但是 split_part() 更简单、更快。

关于split_part()

  • Split comma separated column data into additional columns

关于substring()regular expressions

可以尝试 REGEXP_SUBSTR 如下所示:

--splitting the text with delimiter as ':'
--removing " to clean the remaining text
    Select replace(REGEXP_SUBSTR('"Office: (415) 438-4437"', '[^:]+', 1, 1), '"') as Phone_Type,
    replace(REGEXP_SUBSTR('"Office: (415) 438-4437"', '[^:]+', 1,2), '"') as Phone  from Dual;