使用CASE语句实现条件关联时出现语法错误求助
解决条件关联查询的CASE语法错误问题
原SQL的问题分析
你的CASE语句写法存在语法错误:CASE表达式要求THEN子句返回具体值(如数字、字符串),不能直接放置布尔比较表达式(cce.OWNING_ENTITY_ID = cce.ORGANIZATION_ID)。此外,当条件不满足时CASE会返回NULL,NULL在AND条件中会被视为false,导致所有不满足OWNING_ENTITY_ID = ORGANIZATION_ID的行都被过滤,这不符合你“不匹配则不执行关联”的需求。
正确写法方案
根据你的需求(仅当OWNING_ENTITY_ID = ORGANIZATION_ID时关联SYSTEM_ITEMS表,不匹配时直接返回INV_TRANSACTIONS的行),提供两种可行写法:
方案1:LEFT JOIN + 条件过滤
通过左连接结合WHERE条件,区分两种场景:
SELECT cce.* FROM INV_TRANSACTIONS cce LEFT JOIN SYSTEM_ITEMS DEF ON cce.LOCATOR_ID = DEF.LOCATOR_ID WHERE (cce.OWNING_ENTITY_ID = cce.ORGANIZATION_ID AND DEF.LOCATOR_ID IS NOT NULL) OR cce.OWNING_ENTITY_ID != cce.ORGANIZATION_ID
方案2:UNION ALL拆分场景
将两种逻辑拆分为两个查询,用UNION ALL合并结果,逻辑更清晰:
-- 场景1:OWNING_ENTITY_ID与ORGANIZATION_ID匹配,执行关联 SELECT cce.* FROM INV_TRANSACTIONS cce JOIN SYSTEM_ITEMS DEF ON cce.LOCATOR_ID = DEF.LOCATOR_ID WHERE cce.OWNING_ENTITY_ID = cce.ORGANIZATION_ID UNION ALL -- 场景2:OWNING_ENTITY_ID与ORGANIZATION_ID不匹配,不执行关联 SELECT cce.* FROM INV_TRANSACTIONS cce WHERE cce.OWNING_ENTITY_ID != cce.ORGANIZATION_ID
补充说明
如果你的需求是“仅当匹配时才返回关联后的行,不匹配时不返回任何行”,那可以简化为内连接加直接条件,不需要CASE:
SELECT cce.* FROM INV_TRANSACTIONS cce JOIN SYSTEM_ITEMS DEF ON cce.LOCATOR_ID = DEF.LOCATOR_ID WHERE cce.OWNING_ENTITY_ID = cce.ORGANIZATION_ID
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

