删除替换字符?从列

mas*_*tti 3 sql teradata

根据我迄今为止的研究,这个字符表示数据库和前端之间的编码错误。不幸的是,我对其中任何一个都没有任何控制权。我正在使用 Teradata Studio。

如何过滤掉这个字符?我正在尝试对REGEX_SUBSTR偶尔包含 的列执行一个函数?,这会引发错误“字符串包含不可翻译的字符”。

这是我的 SQL。AIRCFT_POSITN_ID是包含替换字符的列。

 SELECT DISTINCT AIRCFT_POSITN_ID, 
 REGEXP_SUBSTR(AIRCFT_POSITN_ID, '[0-9]+') AS AUTOROW
 FROM PROD_MAE_MNTNC_VW.FMR_DISCRPNCY_DFRL 
 WHERE DFRL_CREATE_TMS > CURRENT_DATE -25
Run Code Online (Sandbox Code Playgroud)

Dav*_*itz 5

您的诊断是正确的,因此首先,您可能需要检查会话字符集(它是连接定义的一部分)。如果是ASCII将其更改为UTF8,您将能够看到原始字符而不是替换字符。


如果字符确实是数据的一部分,而不仅仅是编码翻译问题的指示:

替代字符 AKA SUB(DEC:26 HEX:1A)在 Teradata 中非常独特。

你不能直接使用它 -

select  '?';

-- [6706] The string contains an untranslatable character.
Run Code Online (Sandbox Code Playgroud)
select  '1A'XC;

-- [6706] The string contains an untranslatable character.
Run Code Online (Sandbox Code Playgroud)

如果您使用的是 14.0 或更高版本,则可以使用CHR函数生成它:

select  chr(26);
Run Code Online (Sandbox Code Playgroud)

如果你低于 14.0 版本,你可以像这样生成它:

select  translate (_unicode '05D0'XC using unicode_to_latin with error);
Run Code Online (Sandbox Code Playgroud)

生成字符后,您现在可以将其与REPLACEOTRANSLATE 一起使用

create multiset table t (i int,txt varchar(100) character set latin) unique primary index (i);

insert into t (i,txt) values (1,translate ('Hello ???? world ????' using unicode_to_latin with error));
Run Code Online (Sandbox Code Playgroud)
select * from t;

-- Hello ???? world ????
Run Code Online (Sandbox Code Playgroud)
select otranslate (txt,chr(26),'') from t;

-- Hello  world 

select otranslate (txt,translate (_unicode '05D0'XC using unicode_to_latin with error),'') from t;

-- Hello  world 
Run Code Online (Sandbox Code Playgroud)

顺便说一句,OTRANSLATEOREPLACE有两个版本:

  • syslib下的函数适用于LATIN
  • TD_SYSFNLIB下的函数与UNICODE 一起使用