2

以下のステートメントを使用していますが、このエラーが発生します。

選択に失敗しました。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" 
4

3 に答える 3

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
于 2015-10-07T07:08:52.860 に答える
1
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一意の値を割り当てる必要がある部分の列を選択していました。

于 2015-10-07T02:25:20.167 に答える