Teradata Substr:字符串越界错误

Teradata Substr:字符串越界错误,teradata,Teradata,我为下面的substr获取字符串越界错误。我怎样才能克服这一点 SEL DRAWING_NUMBER ,CASE WHEN SUBSTR(DRAWING_NUMBER,1,1) ='Y' THEN SUBSTR(DRAWING_NUMBER ,1,(INDEX(DRAWING_NUMBER , '.')-1)) ELSE DRAWING_NUMBER END AS DERIVED_DRAWING FROM GEEDW_D_PLP_BULK_

我为下面的substr获取字符串越界错误。我怎样才能克服这一点

 SEL DRAWING_NUMBER
    ,CASE 
      WHEN SUBSTR(DRAWING_NUMBER,1,1) ='Y' THEN  SUBSTR(DRAWING_NUMBER ,1,(INDEX(DRAWING_NUMBER , '.')-1))
    ELSE  DRAWING_NUMBER
    END AS DERIVED_DRAWING
     FROM  GEEDW_D_PLP_BULK_V.CDR_DOCUMENTUM_TRSMTL

最有可能的是,以“Y”开头的
图纸编号的某些值不包含“.”字符。
在这些情况下,
索引(图纸编号“.”)
将返回0。在这种情况下,您的
SUBSTR(图纸编号,1,(索引(图纸编号,)-1)
将计算为
SUBSTR(图纸编号,1,-1)
,这超出了SUBSTR函数的定义范围。

您可能正试图实现的目标是:

SEL 
  DRAWING_NUMBER
  ,CASE 
    WHEN (SUBSTR(DRAWING_NUMBER, 1, 1) ='Y') AND (INDEX(DRAWING_NUMBER , '.') > 0)
      THEN  SUBSTR(DRAWING_NUMBER, 1, (INDEX(DRAWING_NUMBER , '.') - 1))
    ELSE DRAWING_NUMBER
  END AS DERIVED_DRAWING
FROM GEEDW_D_PLP_BULK_V.CDR_DOCUMENTUM_TRSMTL;

您可以改用LIKE来重写:

CASE WHEN DRAWING_NUMBER LIKE 'Y%.%' 
     THEN SUBSTR(DRAWING_NUMBER ,1,(INDEX(DRAWING_NUMBER , '.')-1)) 
     ELSE DRAWING_NUMBER
END
您也可以切换到标准SQL:

CASE WHEN DRAWING_NUMBER LIKE 'Y%.%' 
     THEN SUBSTRING(DRAWING_NUMBER FROM 1 FOR POSITION('.' IN DRAWING_NUMBER) -1) 
     ELSE DRAWING_NUMBER
END

您好,Igor,谢谢您的回复。是的,您是对的,在绘图编号中有带“否”的值。谢谢您,dnoeth…有带“否”的值。在绘图编号中,这就是它生成越界错误的原因。想知道一件事…我们如何获得字符的第二次出现。我们在teradata中没有INSTR,我尝试了using INDEX和Substring,它工作了,但太复杂了。我在某处看到了你的帖子,你建议使用UDF。我如何才能工作,在哪里可以找到它?@user3901666:TD14之前,你可以安装在上找到的Oracle UDF,但这已经过时,最好向TD支持部门咨询最新版本。