我是ETL的新手,我被分配了一项任务,在将数据提供给客户之前对一些敏感信息进行消毒。
我正在使用色彩网页客户端与Impala。
我想做的是:
例如,像'京客隆(三里屯店)'
这样的列信息,然后我需要将其转换为类似于'京XXX店)'
的内容。
我的问题是:
select '京客隆(三里屯店)', concat(substr('京客隆(三里屯店)', 1, 3), 'XXX', substr('京客隆(三里屯店)', char_length('京客隆(三里屯店)') -6, 6));
但在输出中我会胡说八道:
'京客隆(三里屯店)' | concat(substr('京客隆(三里屯店)', 1, 3), 'xxx', substr('京客隆(三里屯店)', char_length('京客隆(三里屯店)') - 6, 6))
京客隆(三里屯店) | 京XXX�店�
问题是:
select '京客隆(三里屯店)', substr('京客隆(三里屯店)', char_length('京客隆(三里屯店)') -3 , 3);
输出:京客隆(三里屯店) ��
不能得到正确的字符。为什么会这样?我在python中粘贴了字符串,如果只使用最后3个字节,就可以得到正确的字符。
发布于 2021-03-26 03:25:33
结果,我误解了函数substr
。
substr(STRING a, INT start [, INT len])
:
它将字符从(包括) INT start
开始。例如,我的字符串'京客隆(三里屯店)'
的总长度是27
字节,每个utf8字符在这里占3个字节。我需要取最后一个3
字节,即)
,然后我需要编写:
substr('京客隆(三里屯店), 27 - 2 ,3 )
。
然后获取25, 26, 27
3字节,并正确显示char )
。
更新:
我被告知要使用:
SELECT regexp_replace('京客隆(三里屯店)', '(.)(.*)(.{2})', '\\1***\\3');
就像一种魅力:P。
https://stackoverflow.com/questions/66810438
复制相似问题