在db2语句中使用sequence是否可行



我正试图在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
)

最新更新