【问题标题】:Using CASE in WHERE clause in Oracle 12c在 Oracle 12c 的 WHERE 子句中使用 CASE
【发布时间】:2021-09-18 02:29:08
【问题描述】:

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

 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


    【解决方案1】:

    您的代码中有大量拼写错误,但是 - 修复后,并且 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,
                                   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 d1.vehicle_id =
                     CASE
                        WHEN d1.vehicle_given = 'YES' THEN d2.vehicle_id
                        ELSE d1.vehicle_id
                     END
                 AND d1.VALUE IS NOT NULL;
    

    【讨论】:

    • d1.vehicle_idNULLd1.vehicle_given <> 'YES' 时,这将不匹配。
    【解决方案2】:

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

     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_idNULL 那么你最终会比较 NULL = NULL 并且结果不是真实的,并且该行将被排除,这不是你想要的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多