2014-09-24 79 views
0

我正在越來越多的字符串越界下面的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 

回答

0

最有可能的一些值爲DRAWING_NUMBER,以'Y'開頭,不包含'。'。 characher。 在這些情況下,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; 
+0

嗨伊戈爾,感謝您的答覆。是的,你是正確的價值觀沒有。在圖號中。 – user3901666 2014-09-25 16:24:23

0

你可能會重寫使用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 
+0

謝謝dnoeth ......有沒有價值。在圖號中,這是它產生無界限錯誤的原因。想知道更多的事情......我們如何才能第二次出現一個角色。我們在teradata中沒有INSTR,我嘗試過使用INDEX和Substring,但它工作起來很複雜。 – user3901666 2014-09-25 16:27:26

+0

我看到你的帖子在某處,你建議去UDF的。我怎樣才能工作,我在哪裏可以找到它? – user3901666 2014-09-25 16:28:22

+0

@ user3901666:在TD14之前,您可以安裝http://downloads.teradata.com/node/179上找到的Oracle UDF,但這已經過時了,最好要求TD支持最新版本。 – dnoeth 2014-09-25 16:50:25