【问题标题】:ORACLE(TOAD) CASE with multiple conditions for different updatesORACLE(TOAD) CASE 不同更新的多个条件
【发布时间】:2021-09-21 00:17:18
【问题描述】:

我需要更新 Oracle 数据库中的资格,我遇到了脚本错误的问题。 我通常会创建一些较小的更新语句来完成工作。

但是我认为做一个查询会更好,这很简单,但我的背景主要是 T-SQL 和 mySQL 而不是 Oracle。

因此,我们将不胜感激。 我的声明。

--ALTER SESSION TO CHANGE DT--
alter session set nls_date_format = 'DD/MM/YYYY HH24:MI:SS';

--Update
Update Qualifications_t
Set (COMMENTS = 'Task'),
    (Expiry_DTS = CASE Expiry_DTS
    When cd = '1'
    Then Expiry_DTS = '31/12/2016 23:59:00'
    When cd = '2'
    Then Expiry_DTS = '01/07/2019 23:59:00'
    When cd = '3'
    Then Expiry_DTS = '31/12/1999 23:59:00'
    When cd = '4'
    Then Expiry_DTS = '31/08/2021 23:59:00'
    When cd = '5'
    Then Expiry_DTS = '17/06/2021 23:59:00')
END
Where EXPIRY_DTS IS NULL;

--SELECT
Select * 
from QUALIFICATIONS_T
where COMMENTS = 'Task';

第 5 行出错 ORA-00905: 缺少关键字 是的,我用谷歌搜索了它,但无法弄清楚。

【问题讨论】:

  • 去掉括号。

标签: sql database oracle


【解决方案1】:

删除更新分配周围的括号。

然后:不清楚您所说的 case 表达式是什么意思。也许是这样:

update qualifications_t
set    comments   = 'task',
       expiry_dts = case when cd = '1' then to_date('31/12/2016 23:59:00',
                                                    'dd/mm/yyyy hh24:mi:ss')
                         when cd = '2' then to_date(....)
                                  (etc.)
                    end
where  expiry_dts is null
;

注意case 表达式的结构。您正在更新的列的名称不属于关键字case 之后,case 表达式直接“返回”值,而不是通过赋值。应该只有一个赋值(“等号”); case 表达式被计算并返回单个值,用于更新。

还要注意表示 date 值的正确方法(假设列数据类型是 date,它应该是;如果不是,您应该先修复它)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多