选择内部案例逻辑

时间:2018-07-17 20:50:31

标签: sql select db2 case create-table

我们具有以下逻辑来创建测试表标志列。

create table "EDI"."TEST" (
    "SHIP_ID" VARCHAR(30) NOT NULL,
    "SHIP_EVNT_CD" VARCHAR(2),
    "AF_FLG" VARCHAR(1) generated always as 
        (case ship_id WHEN (SELECT ship_id FROM EDI.TEST WHERE ship_evnt_cd = 'AF') 
        then 1 else 0 end));

目标是为与具有该ship_evnt_cd的ship_id匹配的每条记录设置标志。

我们遇到一个自然错误

  

用“ SELECT”定义的检查约束或生成的列无效。SQLCODE = -548,SQLSTATE = 42621

我们已经在线查找了该邮件,但表示要重新定义该语句,然后重试。似乎SELECT不起作用,但是我们设法更早地创建了它,但是不得不删除表,然后我们失去了逻辑。

我们也尝试更改案子,但没有成功。

(case WHEN ship_id = (SELECT ship_id FROM EDI.TEST WHERE ship_evnt_cd = 'AF') 
then 1 else 0 end));

(case WHEN ship_id IN (SELECT ship_id FROM EDI.TEST WHERE ship_evnt_cd = 'AF') 
then 1 else 0 end));

我们认为可能缺少任何内容,也许有任何从句,但都卡在这里。

2 个答案:

答案 0 :(得分:1)

使用视图。

CREATE TABLE EDI.TEST_TAB (
    SHIP_ID VARCHAR(30) NOT NULL
,   SHIP_EVNT_CD        CHAR(2) NOT NULL
,   PRIMARY KEY(SHIP_ID, SHIP_EVNT_CD)
)
;
CREATE OR REPLACE VIEW EDI.TEST AS 
SELECT T.*
,   CASE WHEN SHIP_ID IN (SELECT SHIP_ID FROM EDI.TEST_TAB WHERE SHIP_EVNT_CD = 'AF') 
    THEN 1 ELSE 0 END  AS AF_FLG
FROM
    EDI.TEST_TAB T
;

生成的列不能使用子查询 https://www.ibm.com/support/knowledgecenter/en/SSEPGG_11.1.0/com.ibm.db2.luw.sql.ref.doc/doc/r0000927.html

  

AS(生成表达式)       指定列的定义基于表达式。 [剪]   generation-expression 不能包含以下任何内容(SQLSTATE   42621):

    Subqueries
    XMLQUERY or XMLEXISTS expressions
    Column functions
    Dereference operations or DEREF functions
    User-defined or built-in functions that are non-deterministic
    User-defined functions that use the EXTERNAL ACTION option
    User-defined functions that are not defined with NO SQL
    Host variables or parameter markers
    Special registers and built-in functions that depend on the value of a special register
    Global variables
    References to columns defined later in the column list
    References to other generated columns
    References to columns of type XML

答案 1 :(得分:0)

这是我们所想到的,并且可以成功测试,尽管宁愿不使用...

Reset

然后是触发器

create table EDI.TEST (
    "SHIP_ID" VARCHAR(30) NOT NULL,
    "SHIP_EVNT_CD" VARCHAR(2),
    "AF_FLG" VARCHAR(1) DEFAULT 0
);

现在我需要对其他3列执行此操作,所以我想知道是否可以通过不同的WHEN语句(例如,巨大的CASE WHEN)使用相同的触发器进行多列更新,但是,题外话...