【问题标题】:Substr: string out of bounds errorSubstr:字符串越界错误
【发布时间】:2014-11-18 12:29:10
【问题描述】:

下面的 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

【问题讨论】:

    标签: teradata


    【解决方案1】:

    DRAWING_NUMBER 的某些值很可能以“Y”开头,但不包含“.”字符。 在这些情况下,INDEX(DRAWING_NUMBER, '.') 将返回 0。在这种情况下,您的 SUBSTR(DRAWING_NUMBER ,1,(INDEX(DRAWING_NUMBER , '.')-1) 将评估为 SUBSTR(DRAWING_NUMBER, 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;
    

    【讨论】:

    • 嗨,伊戈尔,感谢您的回复。是的,您是对的,存在 no 的值。在图纸编号中。
    【解决方案2】:

    您可以改用 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
    

    【讨论】:

    • 谢谢 dnoeth...有没有 .在图纸编号中,这就是它产生越界错误的原因。还想知道一件事……我们怎样才能让角色第二次出现。我们在 teradata 中没有 INSTR,我尝试使用 INDEX 和 Substring,它有效,但它很复杂。
    • 我在某处看到你的帖子,你建议去 UDF 的。我怎样才能开始工作,在哪里可以找到它?
    • @user3901666:在 TD14 之前,您可以安装在 downloads.teradata.com/node/179 找到的 Oracle UDF,但这已经过时了,最好向 TD 支持寻求最新版本。
    猜你喜欢
    • 2011-12-13
    • 1970-01-01
    • 2019-07-05
    • 1970-01-01
    • 1970-01-01
    • 2014-05-01
    • 1970-01-01
    • 2014-07-31
    • 2023-03-14
    相关资源
    最近更新 更多