teradata SQL 调整专家 - SELECT 失败。 3771: CASE 表达式的 WHEN 子句中的非法表达式
teradata SQL tuning pundits - SELECT Failed. 3771: Illegal expression in WHEN clause of CASE expression
我正在使用如下语句并收到此错误:
SELECT Failed. 3771: Illegal expression in WHEN clause of CASE
expression.
我对 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"
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
部分选择了一个列,您应该在其中分配一个唯一值。
Teradata 不喜欢 EXISTS in Correlated Scalar Subqueries within a 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% 的逻辑中,这样的逻辑可以用 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
这将 return 行重复,如果 VolatileTable.C1
不是唯一的,那么您需要将其更改为:
from "Db"."FACTTablew5MillionRows" as ft
left join (select distinct C1 from VolatileTable) Dtb1
on Dtb1.c1=ft.C1
替换
WHEN EXISTS (...)
由
WHEN 1 = (SELECT 1 WHERE EXISTS (...))
我正在使用如下语句并收到此错误:
SELECT Failed. 3771: Illegal expression in WHEN clause of CASE expression.
我对 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"
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
部分选择了一个列,您应该在其中分配一个唯一值。
Teradata 不喜欢 EXISTS in Correlated Scalar Subqueries within a 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% 的逻辑中,这样的逻辑可以用 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
这将 return 行重复,如果 VolatileTable.C1
不是唯一的,那么您需要将其更改为:
from "Db"."FACTTablew5MillionRows" as ft
left join (select distinct C1 from VolatileTable) Dtb1
on Dtb1.c1=ft.C1
替换
WHEN EXISTS (...)
由
WHEN 1 = (SELECT 1 WHERE EXISTS (...))