Специалисты по настройке SQL teradata - Ошибка SELECT. 3771: Недопустимое выражение в предложении WHEN выражения CASE

Я использую инструкцию, как показано ниже, и получаю эту ошибку:

ВЫБРАТЬ Не удалось. 3771: недопустимое выражение в предложении WHEN выражения CASE.

У меня больше надежд на Терадата. SQL Server может это сделать, а Teradata - нет. Как я могу обойти это? Любое решение?

sel ( CASE
    WHEN  EXISTS   ( sel '1' from VolatileTable Dtb1 where Dtb1.c1=FACT_Table_5MillionRows.C1)
    THEN "FACTTablew5MillionRows"."CustomColumName" 
ELSE 'ALL OTHER'
END  ) (NAMED "CustomColumName" )

from
"Db"."FACTTablew5MillionRows" 

person user1874594    schedule 07.10.2015    source источник
comment
НАРОДЫ, как быть, если я ЗАГРУЖАЮ FACTTablew5MillionRows и VolatileTable Dtb1, а затем делаю, когда Dtb1.c1 = FACT_Table_5MillionRows.C1, тогда _____ иначе ___ WOuld, что допускает эквивалентность?   -  person user1874594    schedule 07.10.2015


Ответы (3)


Teradata не любит EXISTS в коррелированных скалярных подзапросах внутри CASE, но вы можете переписать его следующим образом:

select
  ( CASE
       WHEN C1 = ( select MIN(C1) from VolatileTable Dtb1 
                   where Dtb1.c1=ft.C1)
       THEN ft."CustomColumName" 
       ELSE 'ALL OTHER'
    END  ) (NAMED "CustomColumName" )
from
"Db"."FACTTablew5MillionRows" as ft

Если VolatileTable.C1 уникален, вы можете удалить MIN.

Но в 95% такой логике можно заменить ЛЕВОЕ СОЕДИНЕНИЕ:

select
   ft.*,
   CASE WHEN Dtb1.c1 IS NOT NULL 
        THEN ft."CustomColumName" 
        ELSE  'ALL OTHER' 
   end as "CustomColumName" 
from "Db"."FACTTablew5MillionRows" as ft
left join VolatileTable Dtb1 
on Dtb1.c1=ft.C1

Это вернет повторяющиеся строки, если VolatileTable.C1 не является уникальным, тогда вам нужно изменить его на:

from "Db"."FACTTablew5MillionRows" as ft
left join (select distinct C1 from VolatileTable) Dtb1 
on Dtb1.c1=ft.C1
person dnoeth    schedule 07.10.2015
comment
Привет, Дитер, LOJ был тем, о чем я думал и реализовал его. Но я совершенно не понимаю 1-й подход 1 select ( CASE WHEN C1 = ( select MIN(C1) from VolatileTable Dtb1 where Dtb1.c1=ft.C1) THEN ft."CustomColumName" ELSE 'ALL OTHER' END ) (NAMED "CustomColumName" ) from "Db"."FACTTablew5MillionRows" as ft. Min (Col) будет константой, а не тем, что LOJ будет делать правильно? - person user1874594; 08.10.2015
comment
Т.Ю. Дитер. Я обновил свой другой Q прямо здесь stackoverflow.com/questions/32877616/ - person user1874594; 08.10.2015
comment
и здесь stackoverflow.com/questions/33004757/ - person user1874594; 08.10.2015

Заменять

WHEN EXISTS (...)

By

WHEN 1 = (SELECT 1 WHERE EXISTS (...))
person Lukas Eder    schedule 29.05.2018

WHEN  EXISTS (select '1' from VolatileTable Dtb1 
              where Dtb1.c1=FACT_Table_5MillionRows.C1)
THEN somevalue --or a statement that yields a scalar value

Вы выбирали столбец в части then, где вы должны назначать уникальное значение.

person Vamsi Prabhala    schedule 07.10.2015
comment
Нет проблем с выбором столбца в then части оператора case. - person Gordon Linoff; 07.10.2015
comment
Да . ДАЖЕ предложение ответа не работает, это дает ту же ошибку sel ( case WHEN EXISTS (select '1' from VolatileTable Dtb1 where Dtb1.c1=FACT_Table_5MillionRows.C1 ) then 'Flag' ELSE 'flag2' END ) - person user1874594; 07.10.2015
comment
Я согласен с Гордоном. Мы делаем это все время - person user1874594; 07.10.2015
comment
следует выбрать вместо этого SEL? - person Vamsi Prabhala; 07.10.2015
comment
Гордон… я ответил так, потому что я думал, что он выбирает все значения в этом столбце, что тогда не сработает. Однако я не уверен в цитировании строк в тераданных. - person Vamsi Prabhala; 07.10.2015