DB2中如何省略SET语句实现游标取值的布尔判定
问题描述
执行FETCH语句返回的ANSV为VARCHAR类型,其值仅能是'1'或NULL。需要在不使用SET ANS = (ANSV IS NOT NULL);语句的前提下,实现等价的布尔判断逻辑,将结果存入布尔类型变量ANS中。
原代码片段:
DECLARE C1 CURSOR FOR S1; DECLARE ANSV VARCHAR; DECLARE ANS BOOLEAN; SET STMT = "SELECT 1 FROM ..." PREPARE S1 FROM STMT; OPEN C1; FETCH FROM C1 INTO ANSV; CLOSE C1; SET ANS = (ANSV IS NOT NULL);
解决方案
方案1:直接值对比赋值
由于ANSV的取值范围固定为'1'或NULL,可以直接通过等于判断实现等价逻辑:
SET ANS = (ANSV = '1');
当ANSV为'1'时,表达式返回TRUE;当ANSV为NULL时,表达式返回FALSE,和原逻辑完全一致。
方案2:在查询阶段直接返回布尔值
修改预编译的SQL语句,直接在查询中生成布尔结果,这样FETCH时可直接存入ANS,省去额外变量和赋值步骤:
DECLARE C1 CURSOR FOR S1; DECLARE ANS BOOLEAN; -- 无需再声明ANSV变量 SET STMT = "SELECT CASE WHEN 1 IS NOT NULL THEN TRUE ELSE FALSE END FROM ..." PREPARE S1 FROM STMT; OPEN C1; FETCH FROM C1 INTO ANS; CLOSE C1;
如果数据库支持EXISTS函数的布尔返回,还可以简化为:
SET STMT = "SELECT EXISTS(SELECT 1 FROM ...)"
原理是直接将查询的存在性转换为布尔值,一步到位完成需求。
方案3:利用COALESCE函数转换
通过COALESCE将NULL替换为'0',再进行对比判断:
SET ANS = (COALESCE(ANSV, '0') = '1');
COALESCE会返回第一个非空值,因此ANSV为NULL时返回'0',与'1'对比得到FALSE;ANSV为'1'时返回'1',对比得到TRUE,等价于原逻辑。
内容的提问来源于stack exchange,提问作者DB2fan
相关产品推荐
相关产品推荐

