首页 > 解决方案 > 在 Oracle 12c 的 WHERE 子句中使用 CASE

问题描述

我有一个如下的选择语句:

 SELECT * FROM 
   (SELECT d.value, d.line, d.language, l.pos_id, l.vehicle_id,l.vehicle_given
    FROM Vehicle_value d,
    vehicle_document l
    WHERE d.gen_id = l.gen_id
    AND d.pos_id = l.pos_id
    AND d.gen_id = 1255) d1
    LEFT OUTER JOIN
    (SELECT d.value, d.line, d.language, l.pos_id, l.vehicle_id,l.vehicle_given
    FROM TBB_GEN_Daten d,
    TBB_GEN_Lesehilfe l
    FROM Vehicle_value d,
    vehicle_document l,
    WHERE d.gen_id = l.gen_id
    AND d.pos_id = l.pos_id
    AND d.gen_id = 1254) d2
    ON d1.value = d2.value
    AND d1.pos_id = d2.pos_id
    AND case when d1.vehicle_given = 'YES' then (d1.vehicle_id = d2.vehicle_id)
             else end
    AND d1.value is not null;

所以我想仅在 d1.vehicle_given 值为“YES”时将 d1.vehicle_id 与 d2.vehicle_id 进行比较。但是我在这里使用的案例陈述是错误的,因此它不起作用。还有其他可以做这个比较吗?

标签: oracle

解决方案


OR为匹配条件或不匹配条件使用括号和条件YES

 AND (  d1.vehicle_given <> 'YES'
     OR d1.vehicle_given IS NULL
     OR d1.vehicle_id = d2.vehicle_id )

如果您使用CASE如下表达式:

AND d1.vehicle_id = CASE
                    WHEN d1.vehicle_given = 'YES'
                    THEN d2.vehicle_id
                    ELSE d1.vehicle_id
                    END

然后,当ELSE条件匹配时,您将有效地以AND d1.vehicle_id = d1.vehicle_id. 天真地,这看起来应该没问题,但是如果d1.vehicle_id是,NULL那么您最终将进行比较NULL = NULL,结果不是真实的,并且该行将被排除在外,这不是您想要的。


推荐阅读