【问题标题】:Teradata SELECT Failed: [2663] SUBSTR: string subscript out of boundsTeradata SELECT 失败:[2663] SUBSTR:字符串下标超出范围
【发布时间】:2020-09-13 02:54:49
【问题描述】:

我有下面一段失败的代码。

,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 部分。

 SEL PERSON_NAME,INDEX(PERSON_NAME,',' )-1 FROM NDW_SHARED_PII_VIEWS.PERSON_DIM WHERE PERSON_NAME NOT LIKE '%,%';--Giving us results
 output:
 Star Installations Inc -1
 Unassigned -1
 Cable Services Company Inc.    -1

 SEL SUBSTR(PERSON_NAME, 1,INDEX(PERSON_NAME,',' )-1) FROM NDW_SHARED_PII_VIEWS.PERSON_DIM WHERE PERSON_NAME NOT LIKE '%,%';--Failing

 Above query eventually becomes like below which is causing confusion i believe. 

 SEL SUBSTR(PERSON_NAME, 1,-1) FROM NDW_SHARED_PII_VIEWS.PERSON_DIM WHERE PERSON_NAME NOT LIKE '%,%';

包含 ',' 的 PERSON_NAME 运行良好。您能否指导我如何构建查询以避免此错误。

【问题讨论】:

  • 你想对不包含逗号的名字做什么?
  • 如果 PERSON_NAME 不是个人,您可以将其留空,因为我们已经选择了完整的公司名称。
  • SELECT PERSON_NAME,SUBSTR(PERSON_DIM.PERSON_NAME, INDEX(PERSON_DIM.PERSON_NAME,',') +1 ,length(PERSON_DIM.PERSON_NAME)) FROM NDW_SHARED_PII_VIEWS.PERSON_DIM WHERE PERSON_NAME NOT LIKE '%,%' ;
  • 输出: Makotek LLC Makotek LLC Non Pay Disconnects Non Pay Disconnects Vitel Communications LLC Vitel Communications LLC Laguna, Michell Michell Kelly, Shawn Michael Shawn Michael Behinan, Arsene Quentin Dieudonne Arsene Quentin Dieudonne Brookins, Laura Laura跨度>
  • 请编辑您的问题以包含该示例数据和查询。评论不易阅读

标签: sql teradata teradata-sql-assistant


【解决方案1】:

大概有些名字没有逗号。我认为最简单的方法是添加一个:

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

【讨论】:

    【解决方案2】:

    感谢您的回答。

    我在下面尝试过,效果也很好。

    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
    

    【讨论】:

      【解决方案3】:

      使用STRTOK的最短方法:

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

      无需嵌套函数或添加逗号或 CASE ...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-31
        • 2013-04-22
        • 2012-04-27
        • 1970-01-01
        • 1970-01-01
        • 2018-02-28
        • 2014-08-04
        相关资源
        最近更新 更多