【问题标题】:SQL case expression in UPDATE statementUPDATE 语句中的 SQL 案例表达式
【发布时间】:2018-11-07 09:15:31
【问题描述】:

我正在尝试映射此特定 SQL 代码以用于数据仓库。

我有两列 (TARGET) 和 (NET_SALARY),目的是当 TARGET 为 700 时将 NET_SALARY 映射为 0,在其他情况下子字符串净薪水 1、30

我收到缺少右括号的错误

两列都是 varchar2 数据类型

CASE 
  WHEN SRC_CUSTOMER.TARGET = '700' THEN SRC_CUSTOMER.NET_SALARY = '0'
  ELSE SUBSTR(SRC_CUSTOMER.NET_SALARY,1,30)
END

【问题讨论】:

  • 这是存储过程 (PLSQL) 代码,还是 UPDATE/SELECT 的一部分?是 case statement 还是 case expression
  • @jarlh 它是更新/选择代码的一部分
  • 那么你想要一个case表达式,即在case之外做赋值。

标签: sql oracle sql-update case oracle-data-integrator


【解决方案1】:

如果这是在 ODI 映射/接口的上下文中,则只能使用 SQL 而不能使用 PL/SQL。您不能在第一个 THEN 中将值分配给 SRC_CUSTOMER.NET_SALARY。你实际上只需要设置你想要的值,它就会映射到你的目标属性。

试试

CASE 
  WHEN SRC_CUSTOMER.TARGET = '700' THEN '0'
  ELSE SUBSTR(SRC_CUSTOMER.NET_SALARY,1,30)
END

【讨论】:

    【解决方案2】:

    将赋值移动到case关键字之前,并将SRC_CUSTOMER.TARGET作为内部表达式:

    SRC_CUSTOMER.NET_SALARY = 
    CASE SRC_CUSTOMER.TARGET
    WHEN '700' THEN '0'
    ELSE SUBSTR(SRC_CUSTOMER.NET_SALARY,1,30)
    END
    

    可以用decode function重写:

    SRC_CUSTOMER.NET_SALARY = decode(SRC_CUSTOMER.TARGET,'700','0',SUBSTR(SRC_CUSTOMER.NET_SALARY,1,30))
    

    【讨论】:

    • 问题是 SRC_CUSTOMER.TARGET 是另一列,在这种情况下应检查值 700,如果找到则为 0
    • @LorikBerisha 已修复,将 SRC_CUSTOMER 更新为 SRC_CUSTOMER.TARGET
    • 这是一个case 表达式,而不是语句。
    • @jarlh 我想用内心的表达来区分,我更新了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-23
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    相关资源
    最近更新 更多