【问题标题】:teradata SQL tuning pundits - SELECT Failed. 3771: Illegal expression in WHEN clause of CASE expressionteradata SQL 调优专家 - 选择失败。 3771: CASE 表达式的 WHEN 子句中有非法表达式
【发布时间】:2016-01-04 02:55:42
【问题描述】:

我正在使用如下语句并收到此错误:

选择失败。 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" 

【问题讨论】:

  • 如果我 LOJ “FACTTablew5MillionRows” 和 VolatileTable Dtb1 然后当 Dtb1.c1=FACT_Table_5MillionRows.C1 然后 “____” 否则 “___” 会提供等价吗?

标签: sql case teradata exists sql-tuning


【解决方案1】:

替换

WHEN EXISTS (...)

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

【讨论】:

    【解决方案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
    

    【讨论】:

    • 嗨,Dieter,LOJ 是我正在考虑并实施的。但我完全没有得到第一种方法 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 会做对吗?
    • 泰迪特。我在这里更新了我的其他 Q stackoverflow.com/questions/32877616/…
    【解决方案3】:
    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 部分中的一列,您应该在其中分配一个唯一值。

    【讨论】:

    • case 语句的then 部分选择列没有问题。
    • 是的。即使答案建议不起作用,这也会产生相同的错误sel ( case WHEN EXISTS (select '1' from VolatileTable Dtb1 where Dtb1.c1=FACT_Table_5MillionRows.C1 ) then 'Flag' ELSE 'flag2' END )
    • 我同意戈登的观点。我们一直这样做
    • 应该改为选择吗?
    • Gordon..我这样回答是因为我认为它正在选择该列中的所有值,这在那时不起作用。我不确定是否要在 teradata 中引用字符串。
    猜你喜欢
    • 2021-03-26
    • 2021-12-27
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    • 2018-04-04
    • 2021-08-30
    • 1970-01-01
    • 2018-07-18
    相关资源
    最近更新 更多