SQL WHERE 子句中的服务器 CASE WHEN

SQL Server CASE WHEN in WHERE clause

我有一些连接查询。其中一个连接取决于另一个值。

这是我的查询:

SELECT * 
FROM CLIIRE A
LEFT JOIN CLIIOR B ON A.PTA = B.PTA AND A.ORD = B.ORD AND A.ITE = B.ITE
LEFT JOIN CLIORD C ON C.PTA = B.PTA AND C.ORD = B.ORD 
LEFT JOIN CLIPAC D ON C.OPA = D.ORI AND C.PAC = D.PAC
LEFT JOIN CLIREN E ON E.NRE = A.NRE  AND D.INS = E.INS AND A.CPT = E.CPT
LEFT JOIN 
    (SELECT * 
     FROM CLINOM 
     WHERE CLA = (CASE WHEN B.PFA = '88882' THEN 'MD' ELSE 'BU' END )) AS N ON B.PFA = N.COD
LEFT JOIN 
    (SELECT * 
     FROM CLIMED WHERE PRE = '') AS M ON B.PFA = M.MED
LEFT JOIN CLIPRF P ON B.PRF = P.PRF
WHERE 
    (D.INS LIKE 'OM%' OR D.INS LIKE 'SOL%') 
    AND E.NFA IN ('5188') 
    AND A.CPT IN ('fi', 'pi')
ORDER BY 
    E.NFA

但我在行中遇到错误:

LEFT JOIN (SELECT * FROM CLINOM WHERE CLA = (CASE WHEN B.PFA = '88882' THEN 'MD' ELSE 'BU' END )) AS N ON B.PFA=N.COD

看起来 SQL 服务器不允许我这样做:

The multi-part identifier "B.PFA" could not be bound

第 B.PFA 列存在。

谁能帮帮我?谢谢!

问题是外部查询引用在子查询中不可用。令人高兴的是,虽然不需要子查询。试试这个逻辑:

LEFT JOIN CLINOM N
ON P.FA = N.COD AND
   N.CLA = (CASE WHEN B.PFA = '88882' THEN 'MD' ELSE 'BU' END)

而且,您可以在没有 CASE 的情况下使用此短语。假设 B.PFA 不是 NULL:

LEFT JOIN CLINOM N
ON P.FA = N.COD AND
   ((N.CLA = 'MD' AND B.PFA = '88882') OR 
    (N.CLA = 'BU' AND B.PFA <> '88882')
   )

如果B.PFA可以是NULL:

 LEFT JOIN CLINOM N
ON P.FA = N.COD AND
   ((N.CLA = 'MD' AND B.PFA = '88882') OR 
    (N.CLA = 'BU' AND (B.PFA <> '88882' OR B.PFS IS NULL))
   )

如果您愿意,也可以使用COALESCE()