0

这目前正在按预期工作,除非我希望它不使用序列中的下一个值填充 acctnum(如果它为空)。我的问题是在我的 FROM FINAL TABLE 中尝试下一个 if 语句时。它根本不喜欢它。这是一个语法问题,我用谷歌搜索无济于事。

CREATE SEQUENCE acct_seq
START WITH 1
INCREMENT BY 1
NO MAXVALUE
NO CYCLE
CACHE 24
;

SELECT accntnum  AS new_acct, old_acct
FROM FINAL TABLE (
UPDATE accounts INCLUDE(old_acct INT)
SET accntnum = NEXT VALUE FOR acct_seq, old_acct = accntnum
)
ORDER BY old_acct;

我这样做的原因是我可以返回新旧帐号。即使它们为空,我仍然想返回新旧帐户号。

4

1 回答 1

1

从表面上看,这可以通过CASE在语句中使用表达式来完成UPDATE,例如

...
UPDATE accounts INCLUDE(old_acct INT)
SET 
  accntnum = CASE WHEN accntnum IS NOT NULL THEN NEXT VALUE FOR acct_seq END, 
...

但是,DB2 不允许NEXT VALUE在 CASE 表达式中使用。由于您只更新 中的非 NULL 值accntnum,因此您可以在语句中明确指定,UPDATE并在需要时为未修改的行返回 NULL。

SELECT accntnum  AS new_acct, old_acct
FROM FINAL TABLE (
  UPDATE accounts INCLUDE(old_acct INT)
  SET accntnum = NEXT VALUE FOR acct_seq, old_acct = accntnum
  WHERE accntnum IS NOT NULL
)
UNION ALL
SELECT NULL as new_acct, NULL as old_acct
FROM accounts 
WHERE accntnum IS NULL
ORDER BY old_acct;
于 2013-08-21T17:55:53.210 回答