teradata SQL调优专家 - SELECT失败。 3771:CASE表达式的WHEN子句中的非法表达

时间:2015-10-07 02:12:11

标签: sql case teradata exists sql-tuning

我正在使用如下声明并收到此错误:

  

SELECT失败。 3771:CASE的WHEN子句中的非法表达   表达

我对Teradata抱有更大的希望。 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" 

3 个答案:

答案 0 :(得分:2)

Teradata不喜欢CASE中相关标量子查询中的EXISTS,但您可以像这样重写它:

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%这样的逻辑可以被LEFT JOIN取代:

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

答案 1 :(得分:0)

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部分选择了一列,您应该在其中分配唯一值。

答案 2 :(得分:0)

替换

WHEN EXISTS (...)

通过

WHEN 1 = (SELECT 1 WHERE EXISTS (...))