SELECT CA.BCUSTID 儿童CUSTID, FUNC_GETDICTNAME('comm_yesorno', CASE WHEN SUM(1) OVER(PARTITION BY BCUSTID) > 0 THEN 'Y' ELSE 'N' END) 有效会员
FROM CH_CUST CA
ORDER BY CA.BCUSTID;
报错说CA.BCUSTID不存在。
DB2 查询时使用自定义FUNCTION和CASE WHEN和SUM() OVER(),语句最后的ORDER BY中的 ALIAS失效了
-- ##查询语句
SELECT
CA.BCUSTID 儿童CUSTID,
FUNC_GETDICTNAME('comm_yesorno',
CASE
WHEN CA.JOINDATE >= '2022-08-01'
AND CA.ISCARD = 'Y'
AND SUM(CA.DEPOSBAL) OVER(PARTITION BY CA.BCUSTID) >= 1000
THEN 'Y'
ELSE 'N'
END
) 有效会员
FROM CH_CUST CA
ORDER BY CA.BCUSTID DESC;
表结构及数据如下
-- ## 会员表
CREATE TABLE CH_CUST(
BCUSTID BIGINT,--小孩CUSTID
BCUSTNAME VARCHAR(100),--小孩姓名
FAMCUSTID BIGINT,--家长CUSTID
JOINDATE DATE,--入会日期
ISCARD VARCHAR(1),--家长是否有卡
DEPOSBAL DECIMAL(13, 2)--家长存款金额
);
INSERT INTO CH_CUST VALUES
(1, '儿童1', 2, '2022-08-01', 'Y', 500),
(1, '儿童1', 3, '2022-08-01', 'N', 500);
--## 字典相关
CREATE TABLE "EOS_DICT_ENTRY" (
"DICTTYPEID" VARCHAR(128) NOT NULL ,
"DICTID" VARCHAR(128) NOT NULL ,
"DICTNAME" VARCHAR(255) ,
"STATUS" INTEGER ,
"SORTNO" INTEGER ,
"RANK" INTEGER ,
"PARENTID" VARCHAR(255) ,
"SEQNO" VARCHAR(255) ,
"FILTER1" VARCHAR(255) ,
"FILTER2" VARCHAR(255) ) ;
INSERT INTO PBANK.EOS_DICT_ENTRY
(DICTTYPEID, DICTID, DICTNAME, STATUS, SORTNO, "RANK", PARENTID, SEQNO, FILTER1, FILTER2)
VALUES('comm_yesorno', 'N', '否', 1, 2, 1, NULL, '.N.', NULL, NULL);
INSERT INTO PBANK.EOS_DICT_ENTRY
(DICTTYPEID, DICTID, DICTNAME, STATUS, SORTNO, "RANK", PARENTID, SEQNO, FILTER1, FILTER2)
VALUES('comm_yesorno', 'Y', '是', 1, 1, 1, NULL, '.Y.', NULL, NULL);
CREATE OR REPLACE FUNCTION FUNC_GETDICTNAME (
IN_DICTTYPEID VARCHAR(128),
IN_DICTID VARCHAR(128) )
RETURNS VARCHAR(255)
F1: BEGIN ATOMIC
DECLARE V_DICTNAME VARCHAR(255) DEFAULT NULL;
-- ## 获取数据字典项NAME ## --
SET V_DICTNAME = (
SELECT COALESCE(DICTNAME,'') FROM EOS_DICT_ENTRY WHERE DICTTYPEID = IN_DICTTYPEID AND DICTID = IN_DICTID
FETCH FIRST 1 ROWS ONLY
);
-- ## 设置返回值 ## --
IF(V_DICTNAME IS NULL) THEN
RETURN '';
ELSE
RETURN V_DICTNAME;
END IF;
END
这条语句执行后报错:"CA.BCUSTID" is not valid in the context where it is used.. SQLCODE = -206, SQLSTATE=42703, DRIVER=3.72.24
1、ORDER BY CA.BCUSTID换成ORDER BY 儿童CUSTID 不会报错
2、FUNC_GETDICTNAME()删掉,保留()里面的CASE WHEN和SUM() OVER(),不会报错
3、SUM() OVER()及里面的内容删掉换成个1 = 1,不会报错
SELECT CA.BCUSTID 儿童CUSTID, FUNC_GETDICTNAME('comm_yesorno', CASE WHEN SUM(1) OVER(PARTITION BY BCUSTID) > 0 THEN 'Y' ELSE 'N' END) 有效会员
FROM CH_CUST CA
ORDER BY CA.BCUSTID;
为什么会说CA.BCUSTID不存在?
是因为FUNC_GETDICTNAME()和SUM() OVER()一起用导致结果集的结构改变了吗?
你这个是什么数据库。MySQL 还是 DB2 ?
看一下是不是 sql_mode这个属性值导致的
https://www.oschina.net/question/12_2183893
是不是因为查索引时不存在得