注册

字段为空时返回的值与OR参与运算时,求值为 UNKNOWN,不是SQL标准的返回值

生生casey 2026/07/01 106 1

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:dm8
【操作系统】:麒麟v10
【CPU】:
【问题描述】*:
下面sql中的 t.ASSIGNEE_USER_ID为空时,出现异常。
SELECT t.instance_id, t.step_name, t.assignee_user_id, t.assignee_role_code, t.task_status
FROM WF_TASK t
JOIN WF_FLOW_INSTANCE fi ON fi.INSTANCE_ID = t.INSTANCE_ID AND fi.DEL_FLAG = 0
WHERE t.TASK_STATUS IN ('PENDING','CLAIMED')
AND t.INSTANCE_ID = 2072261590812065792
AND (
--t.ASSIGNEE_USER_ID,-1= '139' OR 这样写可以无法查询到数据
--nvl(t.ASSIGNEE_USER_ID,-1)= '139' OR 这样写可以正常查询到数据
--(t.ASSIGNEE_USER_ID IS NOT NULL AND t.ASSIGNEE_USER_ID = '139') OR 这样写可以无法查询到数据
COALESCE(t.ASSIGNEE_USER_ID, '-1') = '139' OR 这样写可以正常查询到数据
((t.ASSIGNEE_USER_ID IS NULL OR t.ASSIGNEE_USER_ID = '')
AND t.ASSIGNEE_ROLE_CODE IS NOT NULL
AND INSTR(',' || t.ASSIGNEE_ROLE_CODE || ',', ',' || 'ZHONGXINZIJINBUCHUNA' || ',') > 0)
);

当任务是候选(ASSIGNEE_USER_ID 为 NULL)时,第一支 NULL = '139' 求值为 UNKNOWN。按 SQL 标准 UNKNOWN OR TRUE 应为 TRUE,
但达梦在这个 WHERE(带 join)语境下把这一行过滤掉了——所以候选任务谁都看不到。

回答 0
暂无回答
扫一扫
联系客服