Ошибка выбора Teradata: [2663] SUBSTR: нижний индекс строки выходит за границы - PullRequest
1 голос
/ 26 мая 2020

У меня ниже фрагмент кода, который не работает.

,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, который содержит ',' работают нормально. Не могли бы вы посоветовать мне, как сформировать запрос, чтобы избежать этой ошибки.

Ответы [ 3 ]

1 голос
/ 26 мая 2020

Предположительно, у некоторых имен нет запятой. Я думаю, что самый простой способ - просто добавить один:

COALESCE(SAP.LAST_NAME,
         SUBSTR(PERSON_DIM.PERSON_NAME, 1, INDEX(PERSON_DIM.PERSON_NAME || ',', ',' ) - 1
               )
        ) AS Lastname
0 голосов
/ 26 мая 2020

Самый короткий способ использует STRTOK:

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

Нет необходимости во вложенных функциях или добавлении запятой или CASE ...

0 голосов
/ 26 мая 2020

Спасибо за ответы.

Я пробовал ниже, и это тоже сработало.

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
...