impala查询转义问题

select REGEXP_REPLACE('佰分贰拾(深圳)品牌管理有限公司', '\\(', '(')

然后

SELECT  vendor_full_name,REGEXP_REPLACE(vendor_full_name, '\\(', '(') 
FROM odsmdmdata.sms_vendor_party_t

报错,这就日了狗了 仔细看报错日志 我就两个\\ 怎么就被转义成4个\\了

所以我只用一个\就好

SELECT  vendor_full_name,REGEXP_REPLACE(vendor_full_name, '\(', '(') 
FROM odsmdmdata.sms_vendor_party_t
where  sms_vendor_id ='40539';

 

接着研究下 REGEXP_REPLACE 函数

Impala String Functions | 5.9.x | Cloudera Documentationicon-default.png?t=M276https://docs.cloudera.com/documentation/enterprise/5-9-x/topics/impala_string_functions.html

[localhost:21000] > select regexp_replace('aaabbbaaa','b+','xyz');
+------------------------------------------+
| regexp_replace('aaabbbaaa', 'b+', 'xyz') |
+------------------------------------------+
| aaaxyzaaa                                |
+------------------------------------------+
Returned 1 row(s) in 0.11s

 这里好理解 b+只得是1个b或者多个b 这里匹配到了bbb 所以bbb替换到xyz ,so easy

[localhost:21000] > select regexp_replace('aaabbbaaa','(b+)','<\\1>');
+----------------------------------------------+
| regexp_replace('aaabbbaaa', '(b+)', '<\\1>') |
+----------------------------------------------+
| aaa<bbb>aaa                                  |
+----------------------------------------------+
Returned 1 row(s) in 0.11s

这里(b+) 指的是 bbb这三个整体 注意这个括号不能省略, <\\1>中的\\就是上文bbb  ,<>就是包围

select 
regexp_replace('aaabbbaaa','(b+)','<\\1>'),
regexp_replace('aaabbbaaa','b+','<\\1>'), --验证必须有()
regexp_replace('aaabbbaaa','(b+)','【\\1】'),--验证<>可以随意替换
regexp_replace('aaabbbaaa','a(b+)','【\\1】')--验证只有括号里的才有用

[localhost:21000] > select regexp_replace('123-456-789','[^[:digit:]]','');
+---------------------------------------------------+
| regexp_replace('123-456-789', '[^[:digit:]]', '') |
+---------------------------------------------------+
| 123456789                                         |
+---------------------------------------------------+

[[:digit:]]代表数字,这种写法是为了避免转义字符, ^是非的意思

验证

select regexp_replace('123-456-789','[^\\d+]',''), 
regexp_replace('123-456-789','[[:digit:]]','') 

 

以上3个demo都很简单,但是我网上查到一个突然就有点懵了

SELECT REGEXP_REPLACE('(jackie)&|(jackie chan)', '\\(|\\)|(|)', ' ') 

乍一看好像很复杂。。

实际上还好。

\\(|\\)|(|)' 其实可以看作 \\(  |   \\)   |  (|) 也就是\\( = ( ,\\)=) ,|=或的意思 ,(|)这个是啥呢?经过我测试(|)=()=两个字符中间没有空的那个没空,验证如下

SELECT REGEXP_REPLACE('(jackie)&|(jackie chan)', '\\(|\\)|(|)', ' ') ,
REGEXP_REPLACE('(jackie)&|(jackie chan)', '\\(|\\)|()', ' ') ,--这个为了说明(|)=()
REGEXP_REPLACE('(jackie)&|(jackie chan)', '\\(|\\)', ' ') ,--这个为了说明这个正则就是匹配()把它替换空格
REGEXP_REPLACE('(jackie)&|(jackie chan)', '()', '-') -- 这个为了说明()=无空

——————————————————————————————————————————

顺道学习点函数

split_part

select split_part('one***two***three','***',2);
+-------------------------------------------+
| split_part('one***two***three', '***', 2) |
+-------------------------------------------+
| two                                       |
+-------------------------------------------+

select split_part('one\|/two\|/three','\|/',3);
+-------------------------------------------+
| split_part('one\|/two\|/three', '\|/', 3) |
+-------------------------------------------+
| three                                     |
+-------------------------------------------+

translate

select translate ('hello world','world','earth');

+--------------------------------------------+
| translate('hello world', 'world', 'earth') |
+--------------------------------------------+
| hetta earth                                    |
+--------------------------------------------+

我有另外一篇文章专门解释translate 暂不说了。

说下其他的 中文乱码, 但是replace 是可以的。暂无解决办法

 --未完待续

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值