【问题标题】:Problem with CASE statement syntax in teradata (BTEQ)teradata (BTEQ) 中的 CASE 语句语法问题
【发布时间】:2020-06-18 18:19:13
【问题描述】:

关于在 teradata 数据库中插入和检查值,我有以下代码。我的观点是,从平面文件中读取的数据在修剪前导 0 后的值为 0 或 NULL 时不应加载,否则,值应该加载到目标表中......

VALUES
(    
  CASE STUD_ID WHEN TRIM(LEADING '0' FROM :STUD_ID) NOT IN ('0', NULL) THEN TRIM(LEADING '0' FROM :STUD_ID)
  ELSE NEXT 
  END,
  :B,
  :C

)

我不确定条件语句中是否存在 teradata 的下一条语句...我遇到了这个错误

   Illegal expression in WHEN clause of CASE expression.
   Statement# 1, Info =0 

我尝试使用 VALUES 区域中的 select 语句,

VALUES
(
   SELECT (CASE STUD_ID WHEN TRIM(LEADING '0' FROM :STUD_ID) != '0' THEN TRIM(LEADING '0' FROM :STUD_ID)
         ELSE 1000
         END )
  FROM :STUD_ID,
  :B,
  :C

)

我收到了这个错误声明...

 Syntax error, expected something like ')' between '(' and 
the 'SELECT' keyword.

【问题讨论】:

    标签: conditional-statements case teradata


    【解决方案1】:

    CASE ... WHEN 语法需要一个用于比较的值(即CASE some_expression WHEN 1 THEN 'Y')。请改用CASE WHEN ... 表单:

    CASE 
      WHEN TRIM(LEADING '0' FROM :STUD_ID) NOT IN ('0', NULL) 
        THEN TRIM(LEADING '0' FROM :STUD_ID)
      ELSE NEXT 
    END
    

    您也可以这样做:

    COALESCE(NULLIF(TRIM(LEADING '0' FROM :STUD_ID),0),NEXT) -- Return "NEXT" if 0 or NULL
    

    【讨论】:

      【解决方案2】:

      有几个问题,馄饨修复了语法。

      但是你的逻辑也有缺陷:TRIM(LEADING '0' FROM :STUD_ID) NOT IN ('0', NULL) 永远不会是真的,因为在修剪零之后你永远不会得到'0',而且任何 cpmparison 为 NULL 都会产生unknownCASE WHEN TRIM(LEADING '0' FROM :STUD_ID) = '' OR :STUD_ID IS NULL THEN 解决了这个问题。

      但是根据您的previous question,您想跳过这一行,而这在 BTEQ 中是不可能的。切换到加载实用程序/TPT(如果行数较多,则首选)或按原样加载临时表中的数据并在 INSERT/SELECTing 到目标时应用过滤器。

      【讨论】:

        猜你喜欢
        • 2018-08-25
        • 2017-04-01
        • 2014-11-18
        • 2015-01-11
        • 2015-05-05
        • 2015-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多