rt简单的问题

解决方案 »

  1.   

    not(condition)应该相当于decode(condition, true, true, false)
    2<null结果不是true,所以应该返回false
      

  2.   

    汗照你这么说
    not false 也返回false了
      

  3.   

    1楼个大厦比
    not(2>3) 结果是 true 
    decode(2>3, true, true, false) 结果是false相当个鸟阿
      

  4.   

    null不是值,而是空,也不是值为空(''),不能用于> <比较,判断时只能使用is
    当null与< >构成表达式时,表达式不成立,始终返回false。
    2<null 返回 false not(2<null) 同样返回false。
    使用is时的情况:
    2 is null 返回 false;
    not(2 is null) 返回 true。
      

  5.   

    哎~~~~~ 你们怎么不自己试验一下就误人子弟呢?楼上说的不对,1楼的更狠。
    null是unknown的意思,判断时只能使用is和is null,2<null返回的不是false,而是null,
    not(2<null)也就是not(null)返回的是null,不是楼上的not(false)=false!!更不是楼主说的not(2<null)返回false,楼主连问题的本质都没有摸清,就来问人,问得问题都不对!!!
    不信的运行这个:
    begin 
    if  (not(2<null)) is not null then
     DBMS_OUTPUT.PUT_LINE('is not null');
    elsif (not(2<null)) is null then 
     DBMS_OUTPUT.PUT_LINE('is null');
    elsif (not(2<null))  then --true
     DBMS_OUTPUT.PUT_LINE('is true');
    else 
     DBMS_OUTPUT.PUT_LINE('is false');
    end if;
    end;
    /
      

  6.   

    也不明白同问
    null <> '02' false
    null ='02'   false
      

  7.   

    也不知道我没有说明白,还是你没有看明白,
     begin 
    if(null<>'02') then
     DBMS_OUTPUT.PUT_LINE('is true');
    elsif (null<>'02') then
     DBMS_OUTPUT.PUT_LINE('is false');
    else 
     DBMS_OUTPUT.PUT_LINE('null');
    end if;
    end;
    自己试验一下这段程序再来发问,免得被人笑话,现在的年轻人怎么这么浮躁?
      

  8.   

    null是不能比较大小写的
    关于NULL的详细用法,去查下NULL吧
      

  9.   

    更正一下;  
    begin 
    if(null<>'02') then
     DBMS_OUTPUT.PUT_LINE('is true');
    elsif not((null<>'02')) then
     DBMS_OUTPUT.PUT_LINE('is false');
    else 
     DBMS_OUTPUT.PUT_LINE('null');
    end if;
    end;
    这段程序足以证明(null<>'02')既不是false 也不是ture而是null ,null的运算符就有or and not 三种,
      

  10.   

    还是说的详细一些吧。
    null不是值,而是空,也不是值为空(''),不能用于> <比较,判断时只能使用is 或者is not
    null不能用于作值比较,也不能直接与另一null作=值比较,oracle中采用的 is 解决了null与null之间的比较,null is null 返回true。
    null的体质代表空、无效对象、也就是上面opponent说的UNKNOWN,因为用>或>,=等作比较时表达式并不能成立,从人为的理解来看可以认为返回false,但又与false有所不同,因为使用not运算同样不成立,不能返回true,所以Oracle的内部理解为空或UNKNOWN。
    where条件中,子句为 false或unknown都代表不成立,无记录返回。
    参考列表:
    If A is: Condition       Evaluates to: 
    10       a IS NULL       FALSE 
    10       a IS NOT NULL   TRUE 
    NULL     a IS NULL       TRUE 
    NULL     a IS NOT NULL   FALSE 
    10       a = NULL        UNKNOWN 
    10       a != NULL       UNKNOWN 
    NULL     a = NULL        UNKNOWN 
    NULL     a != NULL       UNKNOWN 
    NULL     a = 10          UNKNOWN 
    NULL     a != 10         UNKNOWN
      

  11.   

    简单的说 NULL与任何值的逻辑操作的结果都为FALSE判断是否NULL的办法只能用IS NULL /IS NOT NULL
      

  12.   

    可以参考我的对于NULL的总结(基本上是归纳别人的资料:)http://www.oracle.com.cn/viewthread.php?tid=27309
      

  13.   

    NULL只能做is null 或者 is not null,如果要处理就用NVL函数来做转换
      

  14.   

    baojianjun(包子) ( 两星(中级)) 
    简单的说 NULL与任何值的逻辑操作的结果都为FALSE
    ------------------------------------------------NULL OR TRUE
    结果
    TRUE
      

  15.   

    与nul的任何逻辑操作都是false,不管嵌套多少层,not ( not ( 1 < null)) 和 1 < null 结果是一样的
      

  16.   

    1 判断是否为null只能is null,或者is not null
    2 2<null,无论前面是否有not,结果都是null;进一步说,任何与null进行比较,结果都为null
    3 至于null和true或者false进行and 或者or,这个要详细解释一下。在这里,null是布尔类型,与true或者false的结果都是未知的,即null。但是null and false肯定是false,null or true肯定是true
     
      

  17.   

    to opponent():
    包子已经说明了简单的说,除了两种例外情况:
    1. NULL OR TRUE 结果 TRUE
    2. NULL AND FALSE 结果 FALSE
    原因,or操作只要存在为真的条件就可以返回true,and操作只要存在为假的条件就可以返回false
    这两种情况下不管是否与null进行操作,都是可以当作没有与null进行操作,因为可以忽略与null操作就可以得到正确的结果
      

  18.   

    我觉得大家很容易陷入一个误区,就是在where的语句里 false 和 null 的结果是一样的,所以很容易把null当成false。但是null与false是完全不一样的,如果懂得了这点,就不会陷入误区了。
      

  19.   

    楼上说得对,false和null是不一样的。包子说的:NULL与任何值的逻辑操作的结果都为FALSE,是不对的
      

  20.   

    确实是我的粗心哈,把话讲的太绝对了:)
    谢谢大家的指正
    我的测试情况如下:SQL> DECLARE
      2  IS_T BOOLEAN;
      3  BEGIN
      4  IS_T := TRUE;
      5  IF ( NULL AND IS_T) THEN
      6    DBMS_OUTPUT.PUT_LINE('null and true is true ');
      7  ELSE
      8    DBMS_OUTPUT.PUT_LINE('null and true is false');
      9  END IF;
     10  END;
     11  /null and true is falseSQL> DECLARE
      2  IS_T BOOLEAN;
      3  BEGIN
      4  IS_T := TRUE;
      5  IF ( NULL OR IS_T) THEN
      6    DBMS_OUTPUT.PUT_LINE('null or true is true ');
      7  ELSE
      8    DBMS_OUTPUT.PUT_LINE('null or true is false');
      9  END IF;
     10  END;
     11  /null or true is true 
      

  21.   

    应该这样说比较好 NULL 和任何非布尔值的逻辑操作结果都是FALSE
      

  22.   

    呵呵,其实我关注这个贴的主要原因是想跟大家共同探讨这个很多人都有的误区。
    不好意思再纠正一下:
    5 IF ( NULL AND IS_T) THEN
    6 DBMS_OUTPUT.PUT_LINE('null and true is true ');
    7 ELSE
    8 DBMS_OUTPUT.PUT_LINE('null and true is false');
    9 END IF;NULL AND IS_T 的结果有三种情况:null false true  
    如果NULL AND IS_T 为true则 输出 null and true is true
    如果NULL AND IS_T 为false或者null 则 输出 null and true is false你应该改称这样就知道真正的结果了:
     if( NULL AND IS_T) THEN
      DBMS_OUTPUT.PUT_LINE('null and true is true ');
     elsif not( NULL AND IS_T) then 
     DBMS_OUTPUT.PUT_LINE('null and true is  false');
     else 
      DBMS_OUTPUT.PUT_LINE('null and true is null');
     end if;结果输出null and true is null
    我感觉你还是没有转过弯来。
      

  23.   

    你的程序有个真相被掩盖了,就是当结果为null或者false的时候,就会输出 null and true is false,然后误区就在这,很多人把结果当成了 false所造成的,其实当null的时候也会走这条分支。
    在select 的时候当where语句为false时,无纪律。
    但是很多人忽视了当 为null 时 ,也无纪律。
      

  24.   

    to baojianjun(包子):嘎嘎,第一个例子不是很对哦
    SQL> DECLARE
    2 IS_T BOOLEAN;
    3 BEGIN
    4 IS_T := TRUE;
    5 IF ( NULL AND IS_T) THEN
    6 DBMS_OUTPUT.PUT_LINE('null and true is true ');
    7 ELSE
    8 DBMS_OUTPUT.PUT_LINE('null and true is false');
    9 END IF;
    10 END;
    11 /这个例子不能说明null and true的结果就是true或者false呢
    SQL> declare
      2  result boolean := false;
      3  begin
      4  result := null and true;
      5  if result then
      6     dbms_output.put_line('reuslt is true');
      7  else
      8     if not result then
      9        dbms_output.put_line('reuslt is false');
     10     else
     11        dbms_output.put_line('reuslt is unknown');
     12     end if;
     13  end if;
     14  end;
     15  /reuslt is unknownPL/SQL procedure successfully completed第一个例子应该是说null and false的结果才对,第二个例子说的是null or true
      

  25.   

    〉〉null不是值,而是空,也不是值为空(''),
    瞎说,9i以上自己试试
    select * from sometable where '' is null
      

  26.   

    '' is null 不能说明null 为 '' null代表未知情况。而''代表空值。
    空值属于未知情况的一种,所以'' is null 返回 true。但不能这样表示:null is ''
    另外不能=。
    where 子句中
    '' = '' 也不能返回值。
      

  27.   

    ?  〉〉null不是值,而是空,也不是值为空(''),
    瞎说,9i以上自己试试
    select * from sometable where '' is null
    --------------
    也没有发现真相,呵呵,学海无涯阿。
      

  28.   

    当然,你综合起来看吗,这还不能说明吗?
    select * from sometable  where null is null(ok)
    select * from sometable  where null = null(x)
    select * from sometable  where '' is null(ok)
    select * from sometable  where '' = ''(x)另外null is ''
    是语法的限制,不能说明任何问题。
    ''就是null,没啥特殊的,你往表里插数据的时候,
    你插''不就是null么。
      

  29.   

    汗一个:)原来是这样的哇看来以前的理解还真的是很有问题.第一个例子确实是被现象掩盖了事实,其中还有NULL和FALSE的可能性,谢谢个位指点哦这样讨论也好,学海无涯阿