Sql Teradata选择失败:[2663]子字符串:字符串下标超出范围

Sql Teradata选择失败:[2663]子字符串:字符串下标超出范围,sql,teradata,teradata-sql-assistant,Sql,Teradata,Teradata Sql Assistant,下面是一段失败的代码 ,COALESCE(SAP.LAST_NAME, SUBSTR(PERSON_DIM.PERSON_NAME, 1,INDEX(PERSON_DIM.PERSON_NAME,',' )-1)) AS Lastname Error: SELECT Failed: [2663] SUBSTR: string subscript out of bounds in PERSON_NAME 我调试并发现SUBSTR(PERSON_DIM.PERSON_NAME,1,INDEX(P

下面是一段失败的代码

,COALESCE(SAP.LAST_NAME, SUBSTR(PERSON_DIM.PERSON_NAME, 1,INDEX(PERSON_DIM.PERSON_NAME,',' )-1)) AS Lastname

Error: SELECT Failed: [2663] SUBSTR: string subscript out of bounds in PERSON_NAME
我调试并发现SUBSTR(PERSON_DIM.PERSON_NAME,1,INDEX(PERSON_DIM.PERSON_NAME,,')-1部分存在问题


包含“,”的人名运行正常。请您指导我如何框显查询以避免此错误。

可能有些人名没有逗号。我认为最简单的方法是只添加一个:

COALESCE(SAP.LAST_NAME,
         SUBSTR(PERSON_DIM.PERSON_NAME, 1, INDEX(PERSON_DIM.PERSON_NAME || ',', ',' ) - 1
               )
        ) AS Lastname

谢谢你的回答

我在下面试过,效果也不错

COALESCE(SAP.LAST_NAME,
    CASE WHEN PERSON_DIM.PERSON_NAME NOT LIKE '%,%' 
            THEN PERSON_DIM.PERSON_NAME
    ELSE 
            SUBSTR(PERSON_DIM.PERSON_NAME,1,INDEX(PERSON_DIM.PERSON_NAME,',' )-1) END) AS LASTNAME

最短路径利用STRTOK:

COALESCE(SAP.LAST_NAME, StrTok(PERSON_DIM.PERSON_NAME,',',1))

不需要嵌套函数或添加逗号或大小写…

对于不包含逗号的名称,您想做什么?您可以将其保留为空,因为对于名字,如果人名不是个人,我们已经选择了公司全名。选择人名,SUBSTR(PERSON\u DIM.PERSON\u name,INDEX(PERSON\u DIM.PERSON\u name,,)+1,长度(人名)从NDW_共享的视图。PERSON_DIM,其中PERSON_名称不象“,%”;输出:Makotek LLC Makotek LLC非付费断开连接Vitel Communications LLC Vitel Communications LLC Laguna、Michel Michel Kelly、Shawn Michael Shawn Michael Behinan、Arsene Quentin Dieudonne Arsene Quentin Dieudonne Brookins、Lauraped包含示例数据和查询是您的问题。注释不容易阅读
COALESCE(SAP.LAST_NAME, StrTok(PERSON_DIM.PERSON_NAME,',',1))