错误:字符串包含不可翻译的字符 - TERADATA(用于REGEXP_REPLACE操作)

时间:2017-07-18 18:26:52

标签: sql teradata regexp-replace

我需要清理一个字符列,因此我在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.

我需要快速扭转这个瓶颈。

非常感谢帮助! 谢谢!!!!

3 个答案:

答案 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