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)更新多个列,但是好吧,题外话...
我们有以下逻辑来创建测试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)更新多个列,但是好吧,题外话...