需求
有一個字段有字母和數字組成,現要將字母和數字進行分離;
portyarn8088manager
porthdfs9820filse
porthive10000query
要求輸出結果
portyarn8088manager portyarnmanager 8088 porthdfs9820filse porthdfsfilse 9820 porthive10000query porthivequery 10000
select 'porthdfs9820filse' port_info union select 'porthive10000query' port_info union select 'portyarn8088manager' port_info
思路
解題在於把不同字符和數字替換成一個指定的特征字符,這樣可以將一個字符就替換所有的字符,一個特征數字就可以代表所有的數字,在刪除數據的時候,無需逐一查找多個字符或多個數字了。
1、將特征字段替換成指定字符
select port_info, translate(lower(port_info), 'abcdefghijklmnopqrstuvwxyz', repeat('#', 26)) temp_info_1, translate(lower(port_info), '0123456789', repeat('&', 10)) temp_info_2 from (select 'porthdfs9820filse' port_info union select 'porthive10000query' port_info union select 'portyarn8088manager' port_info) t;.
結果如下
porthdfs9820filse ########9820##### porthdfs&&&&filse porthive10000query ########10000##### porthive&&&&&query portyarn8088manager ########8088####### portyarn&&&&manager
2、通過正則,將特定字符刪除
select port_info, regexp_replace(temp_info_2, '\\&', '') alb, regexp_replace(temp_info_1, '\\#', '') zm from (select port_info, translate(lower(port_info), 'abcdefghijklmnopqrstuvwxyz', repeat('#', 26)) temp_info_1, translate(lower(port_info), '0123456789', repeat('&', 10)) temp_info_2 from (select 'porthdfs9820' port_info union select 'porthive10000' port_info union select 'portyarn8088' port_info) t) t;
結果
porthdfs9820 porthdfs 9820 porthive10000 porthive 10000 portyarn8088 portyarn 8088