我正在使用如下声明并收到此错误:
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"
答案 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 (...))