我需要清理一个字符列,因此我在Teradata 14中使用 REGEXP_REPLACE 功能。
同一段代码适用于其他一些数据源(具有相同的LATIN编码)。
使用show table的数据定义给出了以下数据格式:
CREATE SET TABLE pp_oap_cj_t.dc_loss_fdr_kn ,NO FALLBACK ,
NO BEFORE JOURNAL,
NO AFTER JOURNAL,
CHECKSUM = DEFAULT,
DEFAULT MERGEBLOCKRATIO
( PARENT_ID DECIMAL(38,0),
FS_MRCH_NM VARCHAR(25) CHARACTER SET LATIN NOT CASESPECIFIC
) PRIMARY INDEX ( PARENT_ID );
我正在执行的查询如下:
CREATE TABLE pp_oap_pb_piyush_t.CHECKMERCHANT1 AS (
SELECT
FS_MRCH_NM,
REGEXP_REPLACE(trim(Upper(trim(REGEXP_REPLACE( (FS_MRCH_NM ) , '[^a-z]',' ',1,0,'i'))) ), '[[:space:]]+',' ',1,0,'i') as cleaned_merchant
FROM pp_oap_pb_piyush_t.CHECKMERCHANT)
WITH DATA PRIMARY INDEX (FS_MRCH_NM);
错误
CREATE TABLE Failed. 6706: The string contains an untranslatable character.
我需要快速扭转这个瓶颈。
非常感谢帮助! 谢谢!!!!
答案 0 :(得分:2)
引擎盖下的REGEXP_REPLACE将字符集Latin转换为Unicode。您已将变量定义为字符集Latin。当数据具有无法从Latin转换为Unicode的内容时,您会看到错误。最好的办法是修复你的DDL,将字符集设置为Unicode而不是拉丁语。像代码中的TRANSLATE(FS_MRCH_NM USING LATIN_TO_UNICODE WITH ERROR)而不是FS_MRCH_NM应该可以工作。遇到这个问题,当你有不可翻译的字符时会导致空值。
答案 1 :(得分:0)
我们的syslib
中安装了oreplace的非Unicode兼容版本,而我们的td_sysfnlib
中安装了Unicode兼容的版本。如果未指定数据库,则在syslib
之前使用td_sysfnlib
。因此,强制TD使用oreplace的td_sysfnlib
版本可以解决此问题。
这是使用的代码:
SELECT td_sysfnlib.OREPLACE(item_name,'|','') FROM databaseB.sales;
希望对遇到同样问题的其他人有所帮助!
答案 2 :(得分:-1)
TRANSLATE(OREPLACE(TRANSLATE(item_name USING LATIN_TO_UNICODE WITH ERROR),'|','') USING UNICODE_TO_LATIN WITH ERROR) AS LBL