从字符串中提取类型和 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;
我有一个 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;