Select 里面的 Case When 逻辑

Select inside Case When logic

我们有以下逻辑来创建测试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_id 且具有 ship_evnt_cd 的每条记录设置标志。

我们遇到一个约束错误

A check constraint or generated column that is defined with "SELECT" is invalid.. SQLCODE=-548, SQLSTATE=42621

我们已经在网上查过了,但是说要重新定义语句并重试。似乎 SELECT 不起作用,但是我们之前设法创建了它但不得不删除 table 然后我们失去了逻辑。

我们也尝试过改变大小写但没有成功。

(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));

我们认为缺少某些东西,也许是任何条款,但卡在了这里。

使用视图。

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) Specifies that the definition of the column is based on an expression. [snip] The generation-expression cannot contain any of the following (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

这是我们想到的,可以测试成功,虽然本来不想使用...

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

然后是触发器

CREATE TRIGGER Flags
after INSERT ON EDI.TEST
referencing new as n
FOR EACH ROW
WHEN (n.ship_id in (select ship_id from EDI.TEST where ship_evnt_cd = 'AF'))
UPDATE EDI.TEST SET af_flg = 1

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