代码之家  ›  专栏  ›  技术社区  ›  bd528

Oracle组合多个和或(&O)

  •  0
  • bd528  · 技术社区  · 6 年前

    我有以下剧本:

    SELECT
    *
    FROM
        view_pending_comm
    WHERE
        (ok_to_gen = 'Y' AND comm_type = 'Maya' AND stage <> 3 OR stage <> 6 OR stage <> 9)
    OR
        (ok_to_gen = 'Y' AND comm_type = 'Sapphire' AND stage <> 2) 
    

    我需要做的是返回命令类型为maya但不是阶段3、6或9的记录 还有通信类型是蓝宝石,但不是第二阶段。好的,在所有情况下都需要是Y。

    我尝试了上面的脚本,但这也会返回comm_类型为sapphire且stage为2的记录。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Gordon Linoff    6 年前

    使用 not in :

    SELECT *
    FROM  view_pending_comm
    WHERE (ok_to_gen = 'Y' AND comm_type = 'Maya' AND stage NOT IN (3, 6, 9)) OR
        (ok_to_gen = 'Y' AND comm_type = 'Sapphire' AND stage <> 2) 
    

    这个问题是连接不平等的逻辑问题。正确的逻辑是:

    stage = 3 or stage = 6 or stage = 9
    

    然而,否定的用法 and :

    stage <> 3 and stage <> 6 and stage <> 9