我正试图在DB2中执行以下语句。
这很有效。
SELECT NEXT VALUE FOR SCPYMNT.REM_QUERY_NO_SEQ
FROM sysibm.sysdummy1
但是,这会引发数据库错误。
SELECT (
CASE WHEN PYMT_SYS = 1 THEN NEXT VALUE FOR SCPYMNT.REM_QUERY_NO_SEQ
WHEN PYMT_SYS = 2 THEN 'dummy'
else 'dummy'
END )
FROM sysibm.sysdummy1
因此Db2给出以下错误。
Category Timestamp Message
Statusbar 18.04.2016 11:47:39 DB2 Database Error: ERROR [428F9] [IBM][DB2] SQL0348N "NEXT VALUE FOR SCPYMNT.REM_QUERY_NO_SEQ" cannot be specified in this context. SQLSTATE=428F9
在我看来似乎没有语法错误。Db2不允许这种由事例条件和序列组成的查询吗?
@MichaelTiefenbacher,我举了一些例子作为示范。(我真正想实现的是下面这样的目标
SELECT NAME, QUERYNO
FROM FINAL TABLE (INSERT INTO EMPSAMP (NAME, SALARY, QUERYNO)
VALUES('Mary Smith', 35000.00,
CASE WHEN PYMT_SYS = 1 THEN NEXT VALUE FOR REM_SEQ
CASE WHEN PYMT_SYS = 2 NEXT VALUE FOR EFT_SEQ
));
我认为这个问题现在更清楚了。
在向表中插入数据时,序列可用于生成唯一的键或数字。在选择数据时,它们不用于生成唯一的数字。为此,您可以从插入时使用序列的表中检索字段,也可以在SELECT中使用row_number()。
多告诉一些你想要实现的目标也会很有帮助。
根据IBM文档,我发现答案是"否"。
不能在以下上下文中指定NEXT VALUE表达式:CASE表达式
这是链接
从选择的联合中插入:
SELECT NAME, QUERYNO
FROM FINAL TABLE
(
INSERT INTO EMPSAMP
SELECT
'Mary Smith', 35000.00, NEXT VALUE FOR REM_SEQ
FROM SYSIBM.SYSDUMMY1
WHERE PYMT_SYS = 1
UNION ALL
'Mary Smith', 35000.00, NEXT VALUE FOR EFT_SEQ
FROM SYSIBM.SYSDUMMY1
WHERE PYMT_SYS = 2
)