连接表时出错:
with cte1 as
(
select
p.*,
cast(regexp_replace(p.phone_number, '\+|\(|\)\ ', '') as varchar2(50)) as phone
from
PHONE_TABLE p
where
t.phone_number is not null
order by
p.phone_number asc
)
select *
from cte1 t1
join PHONE_TABLE1 t on t.phone = t1.phone
我尝试使用转换功能
1条答案
按热度按时间7vux5j2d1#
您似乎希望在从
phone_number
中删除+()
字符后,分别在phone_number
(字符串)和phone
(数字)列上连接表PHONE_TABLE
和PHONE_TABLE1
。你可以使用
TRANSLATE
函数(避免缓慢的正则表达式):或者,更简单地说,没有CTE:
其中,对于示例数据:
输出:
| ID|电话号码|联系电话|ID|联系电话|
| --------------|--------------|--------------|--------------|--------------|
| 1|电话:+1(23)456|小行星123456|一百零一|小行星123456|
| 二|小行星123456|小行星123456|一百零一|小行星123456|
| 三|九八七六五四|九八七六五四|一百零二|九八七六五四|
如果你在
PHONE_TABLE
中有一个字符串,在删除这些字符后,它将不是一个有效的数字:然后上面的操作会失败,因为在
JOIN
中从字符串到数字的隐式转换会失败。你可以通过显式比较字符串来解决这个问题:或者,在Oracle 12中,将字符串显式转换为数字,并使用
DEFAULT NULL ON CONVERSION ERROR
选项:其输出相同。
fiddle