这目前正在按预期工作,只是我希望它在序列中的下一个值为null时不要填充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;
我这样做的原因是为了能同时返回新帐号和旧帐号。i仍然希望返回新的和旧的帐号,即使它们为空。
在表面上,可以通过在UPDATE
语句中使用CASE
表达式来完成,如
...
UPDATE accounts INCLUDE(old_acct INT)
SET
accntnum = CASE WHEN accntnum IS NOT NULL THEN NEXT VALUE FOR acct_seq END,
...
但是,DB2不允许在CASE表达式中使用NEXT VALUE
。由于您只更新accntnum
中的非NULL值,因此可以在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;