不接受 BEGIN 的情况

问题描述 投票:0回答:1

Case 不接受 Begin

我需要在一个案例中更新 2 个单独的字段,如下所示

UPDATE PYR SET
    MSR = 
      Case 
        When MSR = :WRKH then
        Begin
          MSR = NULL
          WRKDAY = WRKDAY -1
        end;
      end;
sql case firebird firebird-3.0
1个回答
0
投票

这是无效的语法,不会起作用。您似乎认为

CASE
就像 PSQL(Firebird 的过程语言)中的
IF
,但事实并非如此。这也不是
UPDATE
语法的工作方式。
CASE
是一个条件value表达式,它只能返回一个值。

正确的更新语句是将条件放在 WHERE 子句中(正如 Iłya Bursov 在评论中所建议的那样):

update PYR set MSR = NULL, WRKDAY = WRKDAY -1
where MSR = :WRKH

如果这是还更新其他字段的更复杂语句的一部分,则需要为每个字段编写条件:

update PYR set 
  MSR = case when MSR = :WRKH then null else MSR end, 
  WRKDAY = case when MSR = :WRKH then WRKDAY - 1 else WRKDAY end

或(使用

NULLIF
简化)

update PYR set 
  MSR = nullif(MSR, :WRKH), 
  WRKDAY = case when MSR = :WRKH then WRKDAY - 1 else WRKDAY end
© www.soinside.com 2019 - 2024. All rights reserved.