Проблема с синтаксисом оператора CASE в teradata (BTEQ) - PullRequest
0 голосов
/ 06 марта 2020

У меня есть следующий код для вставки и проверки значений в базе данных teradata. Моя точка зрения заключается в том, что данные, которые считываются из плоского файла, чье значение после обрезания, ведущего 0, равно 0 или NULL, не должны загружаться, и если нет , значение должно быть загружено в целевую таблицу .......

VALUES
(    
  CASE STUD_ID WHEN TRIM(LEADING '0' FROM :STUD_ID) NOT IN ('0', NULL) THEN TRIM(LEADING '0' FROM :STUD_ID)
  ELSE NEXT 
  END,
  :B,
  :C

)

Я не уверен, существует ли следующий оператор для teradata в операторе подготовки ... Я получил эта ошибка

   Illegal expression in WHEN clause of CASE expression.
   Statement# 1, Info =0 

Я пытался с помощью оператора select в области VALUES,

VALUES
(
   SELECT (CASE STUD_ID WHEN TRIM(LEADING '0' FROM :STUD_ID) != '0' THEN TRIM(LEADING '0' FROM :STUD_ID)
         ELSE 1000
         END )
  FROM :STUD_ID,
  :B,
  :C

)

Я получил этот оператор ошибки ...

 Syntax error, expected something like ')' between '(' and 
the 'SELECT' keyword.

Ответы [ 2 ]

0 голосов
/ 06 марта 2020

Есть несколько проблем, равиоли исправили синтаксис.

Но ваша логика c также имеет недостатки: TRIM(LEADING '0' FROM :STUD_ID) NOT IN ('0', NULL) никогда не будет верным, потому что после обрезки нулей вы никогда не получите '0' и дополнительно любое сравнение с NULL приводит к unknown. CASE WHEN TRIM(LEADING '0' FROM :STUD_ID) = '' OR :STUD_ID IS NULL THEN исправляет это.

Но, исходя из вашего предыдущего вопроса , вы хотите пропустить эту строку, а это невозможно в BTEQ. Либо переключитесь на утилиту загрузки / TPT (желательно, если это большее количество строк), либо загрузите данные, как в промежуточной таблице, и примените фильтр при ВСТАВКЕ / ВЫБОРЕ в цель.

0 голосов
/ 06 марта 2020

Синтаксис CASE ... WHEN ожидает одно значение для сравнения (т.е. CASE some_expression WHEN 1 THEN 'Y'). Попробуйте вместо этого форму CASE WHEN ...:

CASE 
  WHEN TRIM(LEADING '0' FROM :STUD_ID) NOT IN ('0', NULL) 
    THEN TRIM(LEADING '0' FROM :STUD_ID)
  ELSE NEXT 
END

Вы также можете сделать это:

COALESCE(NULLIF(TRIM(LEADING '0' FROM :STUD_ID),0),NEXT) -- Return "NEXT" if 0 or NULL
...