如何在SQL JOIN中使用CASE语句实现条件关联查询?
修正SQL JOIN条件实现动态关联逻辑
你的需求是在LEFT JOIN时根据T0.PgmKey的值动态调整关联规则:
- 当
T0.PgmKey = 28,关联需满足T1.DrOfRecord = 'T' OR T1.PrimClin = 'T' - 其他情况仅需满足
T1.PrimClin = 'T'
先说说你两次尝试的问题:
- 尝试1:语法完全错误,CASE语句结构混乱,
OR的位置不符合SQL语法,数据库无法解析。 - 尝试2:逻辑思路正确,但部分数据库(比如SQL Server)不支持在JOIN条件中直接使用CASE返回的布尔表达式,会触发语法错误。
下面是两种可行的修正方案:
方案1:直接用逻辑表达式组合(推荐,简洁高效)
这种写法所有SQL数据库都支持,逻辑清晰且性能更优:
SELECT t1.DrOfRecord, t1.* FROM FD__PROGRAM_CLIENT AS T0 LEFT OUTER JOIN FD__STAFF_ASSIGNED AS T1 ON T0.OP__DOCID = T1.programAdmitKey AND ( (T0.PgmKey = 28 AND (T1.DrOfRecord = 'T' OR T1.PrimClin = 'T')) OR (T0.PgmKey != 28 AND T1.PrimClin = 'T') )
方案2:使用CASE语句的兼容写法
如果需要用CASE实现(比如后续有更复杂的分支逻辑),可以让CASE返回1/0并判断等于1,避免布尔表达式的兼容性问题:
SELECT t1.DrOfRecord, t1.* FROM FD__PROGRAM_CLIENT AS T0 LEFT OUTER JOIN FD__STAFF_ASSIGNED AS T1 ON T0.OP__DOCID = T1.programAdmitKey AND CASE WHEN T0.PgmKey = 28 THEN CASE WHEN T1.DrOfRecord = 'T' OR T1.PrimClin = 'T' THEN 1 ELSE 0 END ELSE CASE WHEN T1.PrimClin = 'T' THEN 1 ELSE 0 END END = 1
内容的提问来源于stack exchange,提问作者hubert
相关产品推荐
相关产品推荐

