从列中删除替换字符

时间:2016-10-19 18:13:14

标签: 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

2 个答案:

答案 0 :(得分:3)

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

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

替补角色AKA SUB (DEC:26 HEX:1A)在Teradata中非常独特。

你不能直接使用它 -

select  '�';

-- [6706] The string contains an untranslatable character.
select  '1A'XC;

-- [6706] The string contains an untranslatable character.

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

select  chr(26);

如果您的版本低于14.0版,则可以按如下方式生成:

select  translate (_unicode '05D0'XC using unicode_to_latin with error);

生成角色后,现在可以将其用于 REPLACE OTRANSLATE

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));
select * from t;

-- Hello ���� world ����
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 
顺便说一句, OTRANSLATE OREPLACE 有2个版本:

  • syslib 下的功能适用于 LATIN
  • TD_SYSFNLIB 下的功能适用于 UNICODE

答案 1 :(得分:0)

除了Dudu上面的优秀答案,我想补充以下内容,因为我再次遇到了这个问题并且有更多时间进行实验。以下SELECT命令生成了一个不可翻译的字符:

SELECT IDENTIFY FROM PROD_MAE_MNTNC_VW.SCHD_MNTNC;

IDENTIFY
24FEB1747659193DC330A163DCL�ORD

尝试直接对此字符执行REGEXP_REPLACE或OREPLACE会产生错误:

Failed [6706 : HY000] The string contains an untranslatable character. 

我将Teradata连接中的CHARSET属性从UTF8更改为ASCII,现在我可以看到有问题的字符,看起来像一个标签

IDENTIFY

enter image description here

使用此特定转换的TRANSLATE_CHK命令成功并识别违规字符的位置(请注意,使用UTF8字符集不起作用):

TRANSLATE_CHK(IDENTIFY USING KANJI1_SBC_TO_UNICODE) AS BADCHAR

BADCHAR
28

现在可以使用一些CASE语句来处理这个字符,以删除坏字符并保留字符串的其余部分:

CASE WHEN TRANSLATE_CHK(IDENTIFY USING KANJI1_SBC_TO_UNICODE) = 0 THEN IDENTIFY
ELSE SUBSTR(IDENTIFY, 1, TRANSLATE_CHK(IDENTIFY USING KANJI1_SBC_TO_UNICODE)-1)
END AS IDENTIFY

希望这可以帮助别人。