NULL的算術運算:
在Oracle中,值null被看作一個未知值,任何包含NULL值的算術運算都會得到結果NULL。因此,下面的select語句返回null: Null 字元串:Oracle 把Null 字元串 ('') 當作 null, 因此 length('') 的值是null, 而不是 0。這與 ansi 不相容。
SELECT 5 + 7 + NULL + 9
FROM DUAL;
真值表:
列印boolean類型與 and 或 or 操作的真值表: bool1 bool2| and or
------------+-------------
true true| true true
true false| false true
true null| null true
false true| false true
false false| false false
false null| false null
null true| null true
null false| false null
null null| null null
CREATE TABLE booleans ( bool VARCHAR2(5) );
INSERT INTO booleans
VALUES ('true');
INSERT INTO booleans
VALUES ('false');
INSERT INTO booleans
VALUES ('null');
DECLARE
bool_1 BOOLEAN;
bool_2 BOOLEAN;
bool_and BOOLEAN;
bool_or BOOLEAN;
res_and VARCHAR2 (5);
res_or VARCHAR2 (5);
FUNCTION string_to_bool (str IN VARCHAR2)
RETURN BOOLEAN
IS
BEGIN
RETURN CASE
WHEN str = 'true'
THEN TRUE
WHEN str = 'false'
THEN FALSE
WHEN str = 'null'
THEN NULL
END;
END;
FUNCTION bool_to_str (bool IN BOOLEAN)
RETURN VARCHAR2
IS
BEGIN
RETURN CASE
WHEN bool = TRUE
THEN 'true'
WHEN bool = FALSE
THEN 'false'
WHEN bool IS NULL
THEN 'null'
END;
END;
BEGIN
DBMS_OUTPUT.put_line ('bool1 bool2| and or');
DBMS_OUTPUT.put_line ('------------+-------------');
FOR b1 IN (SELECT bool
FROM booleans)
LOOP
FOR b2 IN (SELECT bool
FROM booleans)
LOOP
bool_1 := string_to_bool (b1.bool);
bool_2 := string_to_bool (b2.bool);
bool_and := bool_1 AND bool_2;
bool_or := bool_1 OR bool_2;
res_and := bool_to_str (bool_and);
res_or := bool_to_str (bool_or);
DBMS_OUTPUT.put_line ( LPAD (b1.bool, 5)
|| ' '
|| LPAD (b2.bool, 5)
|| '| '
|| LPAD (res_and, 5)
|| ' '
|| LPAD (res_or, 5)
);
END LOOP;
END LOOP;
END;
/
組值函數中的NULL: 組值函數對待NULL值的方式與單值函數不同。組值函數忽略NULL值並計算出結果。這些函數包括avg、sum、min、max、stddev、variance、count。NULL值可能對max、min以及sum產生很大影響,因此在使用它們時要小心,特別是占重要百分比的資料為NULL時更要小心。 在這些函數中,Oracle返回非空值,但由你決定此結果是否合理。
count是一個特例。不論用什麼方法處理null,它總是返回一個數字,它不對NULL求值。
NULL與操作符:
一個null值與任何其它值比較,包括null值,結果都是null。如下所示:
op left rel op right
---------- --- ----------
11 = 11
11 < 42
11 ?
42 > 11
42 = 42
42 ?
? 11
? 42
?
CREATE TABLE operand ( op NUMBER );
INSERT INTO operand
VALUES (11);
INSERT INTO operand
VALUES (42);
INSERT INTO operand
VALUES (NULL);
SELECT op_left.op "op left",
CASE
WHEN op_left.op = op_right.op
THEN ' = '
WHEN op_left.op > op_right.op
THEN ' > '
WHEN op_left.op < op_right.op
THEN ' < '
ELSE ' ? '
END "rel",
op_right.op "op right"
FROM operand op_left CROSS JOIN operand op_right
;