null不是值,而是空,也不是值为空(''),不能用于> <比较,判断时只能使用is 当null与< >构成表达式时,表达式不成立,始终返回false。 2<null 返回 false not(2<null) 同样返回false。 使用is时的情况: 2 is null 返回 false; not(2 is null) 返回 true。
哎~~~~~ 你们怎么不自己试验一下就误人子弟呢?楼上说的不对,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; /
也不明白同问 null <> '02' false null ='02' false
也不知道我没有说明白,还是你没有看明白, 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; 自己试验一下这段程序再来发问,免得被人笑话,现在的年轻人怎么这么浮躁?
null是不能比较大小写的 关于NULL的详细用法,去查下NULL吧
更正一下; 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 三种,
还是说的详细一些吧。 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
简单的说 NULL与任何值的逻辑操作的结果都为FALSE判断是否NULL的办法只能用IS NULL /IS NOT NULL
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
to opponent(): 包子已经说明了简单的说,除了两种例外情况: 1. NULL OR TRUE 结果 TRUE 2. NULL AND FALSE 结果 FALSE 原因,or操作只要存在为真的条件就可以返回true,and操作只要存在为假的条件就可以返回false 这两种情况下不管是否与null进行操作,都是可以当作没有与null进行操作,因为可以忽略与null操作就可以得到正确的结果
确实是我的粗心哈,把话讲的太绝对了:) 谢谢大家的指正 我的测试情况如下: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
应该这样说比较好 NULL 和任何非布尔值的逻辑操作结果都是FALSE
呵呵,其实我关注这个贴的主要原因是想跟大家共同探讨这个很多人都有的误区。 不好意思再纠正一下: 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 我感觉你还是没有转过弯来。
你的程序有个真相被掩盖了,就是当结果为null或者false的时候,就会输出 null and true is false,然后误区就在这,很多人把结果当成了 false所造成的,其实当null的时候也会走这条分支。 在select 的时候当where语句为false时,无纪律。 但是很多人忽视了当 为null 时 ,也无纪律。
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
〉〉null不是值,而是空,也不是值为空(''), 瞎说,9i以上自己试试 select * from sometable where '' is null
'' is null 不能说明null 为 '' null代表未知情况。而''代表空值。 空值属于未知情况的一种,所以'' is null 返回 true。但不能这样表示:null is '' 另外不能=。 where 子句中 '' = '' 也不能返回值。
? 〉〉null不是值,而是空,也不是值为空(''), 瞎说,9i以上自己试试 select * from sometable where '' is null -------------- 也没有发现真相,呵呵,学海无涯阿。
当然,你综合起来看吗,这还不能说明吗? 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么。
2<null结果不是true,所以应该返回false
not false 也返回false了
not(2>3) 结果是 true
decode(2>3, true, true, false) 结果是false相当个鸟阿
当null与< >构成表达式时,表达式不成立,始终返回false。
2<null 返回 false not(2<null) 同样返回false。
使用is时的情况:
2 is null 返回 false;
not(2 is null) 返回 true。
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;
/
null <> '02' false
null ='02' false
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;
自己试验一下这段程序再来发问,免得被人笑话,现在的年轻人怎么这么浮躁?
关于NULL的详细用法,去查下NULL吧
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 三种,
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
简单的说 NULL与任何值的逻辑操作的结果都为FALSE
------------------------------------------------NULL OR TRUE
结果
TRUE
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
包子已经说明了简单的说,除了两种例外情况:
1. NULL OR TRUE 结果 TRUE
2. NULL AND FALSE 结果 FALSE
原因,or操作只要存在为真的条件就可以返回true,and操作只要存在为假的条件就可以返回false
这两种情况下不管是否与null进行操作,都是可以当作没有与null进行操作,因为可以忽略与null操作就可以得到正确的结果
谢谢大家的指正
我的测试情况如下: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
不好意思再纠正一下:
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
我感觉你还是没有转过弯来。
在select 的时候当where语句为false时,无纪律。
但是很多人忽视了当 为null 时 ,也无纪律。
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
瞎说,9i以上自己试试
select * from sometable where '' is null
空值属于未知情况的一种,所以'' is null 返回 true。但不能这样表示:null is ''
另外不能=。
where 子句中
'' = '' 也不能返回值。
瞎说,9i以上自己试试
select * from sometable where '' is null
--------------
也没有发现真相,呵呵,学海无涯阿。
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么。