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

如何更改带有条件的WHERE子句?

  •  0
  • gabriel119435  · 技术社区  · 8 年前

    我有以下疑问:

    select t1.a,
           t1.b,
           t2.c,
           ....
      from table1 t1,
           table2 t2,
           ...
     where ...
       and condition1
       and condition2
       and
      case
         when (t1.a in ('aa', 'bb') and
              t1.e = t2.e) then
          true
         when (t1.a in ('cc', 'dd') and
              t1.e = t2.f) then
          true
         else
          false
       end;
    

    我想使用列值确定where子句。查询以上返回 ORA-00920 invalid relational operator 在最后一行。我检查过了 here 调整我的条款。如果 t1.a aa bb ,我必须仅在以下情况下选择行 t1.e = t2.e 返回true。现在如果 t1.a cc dd ,则必须仅在以下情况下选择行 t1.e = t2.f ,比较不同的列。有没有可能不经过程序就做到这一点?

    4 回复  |  直到 8 年前
        1
  •  7
  •   9000    8 年前

    为什么? case 完全您可以生成平凡的布尔输出,它们可以直接使用。

    where
       ...
       and ((t1.a in ('aa', 'bb') and t1.e = t2.e) or
            (t1.a in ('cc', 'dd') and t1.e = t2.f)
       )
    
        2
  •  2
  •   jose_bacoy    8 年前

    如果确实要修复错误,请将true更改为1,将false更改为0,然后将其等同于1。Case语句类似于函数,需要一个表达式(like=1)。

    and
      (case
         when (t1.a in ('aa', 'bb') and
              t1.e = t2.e) then
          1
         when (t1.a in ('cc', 'dd') and
              t1.e = t2.f) then
          1
         else
          0
       end) = 1;
    
        3
  •  2
  •   Gordon Linoff    8 年前

    正确的书写方法是 join 语法。 从不 在中使用逗号 FROM 条款:

    from table1 t1 join
         table2 t2
         on (t1.a in ('aa', 'bb') and t1.e = t2.e) or
            (t1.a in ('cc', 'dd') and t1.e = t2.f)
    

    或者,因为Oracle支持元组:

    from table1 t1 join
         table2 t2
         on (t1.a, t1.e) in ( ('aa', t2.e), ('bb', t2.e), ('cc', t2.f), ('dd', t2.f) )
    
        4
  •  1
  •   Bob Jarvis - Слава Україні    8 年前

    Oracle数据库不支持布尔值。他们 在PL/SQL中可用,但数据库产品本身缺少布尔值,因此不能在查询中使用TRUE和FALSE等值。因此,通常使用字符串值“Y”和“N”或“t”和“f”来表示布尔结果。我建议将您的查询改写为:

    select t1.a,
           t1.b,
           t2.c,
           ....
      from table1 t1,
           table2 t2,
           ...
     where ...
       and condition1
       and condition2
       and case
             when (t1.a in ('aa', 'bb') and
                  t1.e = t2.e)
               then 'Y'
             when (t1.a in ('cc', 'dd') and
                  t1.e = t2.f)
               then 'Y'
             else 'N'
           end = 'Y'
    

    祝你好运。