大家对Java中空字符串与null的区别早已是耳熟能详。那么在PL/SQL中,这二者又有何区别呢?
简单地来说,我们可以认为空字符串‘’等价于Null:即‘’is null。
二者的比较实际上涉及的是PL/SQL中Boolean值的问题。
PL/SQL中Boolean类型的值有3种:TRUE, FALSE, NULL。
NULL用来表示一个错误的,不合适的或者不确定的值。
Boolean值是不能打印的。
表达式 结果
'' IS NULL TRUE
'' = NULL NULL
'' <> NULL NULL
NOT NULL NULL
NULL=NULL NULL
NULL<>NULL NULL
'' = '' NULL
'' <> '' NULL
注:对空字符串‘’和Null进行任何的比较运算(>, <, =)或者算术运算(+, -, x, /) ,最后的结果都是:Null.
通过下面的代码,它们之间的关系就可以一目了然。
DECLARE
v_value VARCHAR2(100);
v_bool BOOLEAN := TRUE;
BEGIN
/*
* 0. Boolean值是不能打印的
* 判断一个Boolean值是TRUE, FALSE 可以用 = , NOT
*/
-- 编译出错
--DBMS_OUTPUT.put_line('Boolean: ' || TRUE);
-- 0.1 output: v_bool = TRUE
IF v_bool
THEN
DBMS_OUTPUT.put_line('0.1 - v_bool = TRUE');
END IF;
-- 0.2 output: v_bool = TRUE
IF v_bool
THEN
DBMS_OUTPUT.put_line('0.2 - v_bool = TRUE');
END IF;
-- 0.3 output: v_bool = FALSE
v_bool := FALSE;
IF v_bool = FALSE
THEN
DBMS_OUTPUT.put_line('0.3 - v_bool = FALSE');
END IF;
-- 0.4 output: v_bool = FALSE
v_bool := FALSE;
IF NOT v_bool
THEN
DBMS_OUTPUT.put_line('0.4 - v_bool = FALSE');
END IF;
/*
* 1. 判断一个变量或值是不是空,要用 IS NULL 或者 IS NOT NULL
* 任何值(含'', null)与NULL进行比较操作(=, <>),结果仍是NULL
* 对NULL进行NOT操作,结果仍是NULL
*/
-- 1.1 yield: v_value IS NULL
IF v_value IS NULL
THEN
DBMS_OUTPUT.put_line('1.1 - v_value IS NULL');
END IF;
-- 1.2 yield: v_value IS NOT NULL
v_value := '123';
IF v_value IS NOT NULL
THEN
DBMS_OUTPUT.put_line('1.2 - v_value IS NOT NULL');
END IF;
-- 1.3 yield: (v_value = NULL) IS NULL
IF (v_value = NULL) IS NULL
THEN
DBMS_OUTPUT.put_line('1.3 - (v_value = NULL) IS NULL');
END IF;
-- 1.4 yield: (v_value <> NULL) IS NULL
IF (v_value <> NULL) IS NULL
THEN
DBMS_OUTPUT.put_line('1.4 - (v_value <> NULL) IS NULL');
END IF;
-- 1.5 yield: (NOT NULL) IS NULL
IF (NOT NULL) IS NULL
THEN
DBMS_OUTPUT.put_line('1.5 - (NOT NULL) IS NULL');
END IF;
-- 1.6 yield: (NULL = NULL) IS NULL
IF (NULL = NULL) IS NULL
THEN
DBMS_OUTPUT.put_line('1.6 - (NULL = NULL) IS NULL');
END IF;
-- 1.7 yield: (NULL <> NULL) IS NULL
IF (NULL = NULL) IS NULL
THEN
DBMS_OUTPUT.put_line('1.7 - (NULL <> NULL) IS NULL');
END IF;
/*
* 2. 判断一个空字符串是不是空,要用 IS NULL 或者 IS NOT NULL;而不是 = '' 或者 <> ''
*/
-- 2.1 yield: '' IS NULL
IF '' IS NULL
THEN
DBMS_OUTPUT.put_line('2.1 - '''' IS NULL');
END IF;
-- 2.2 yield: ('' = '') : IS NULL
IF ('' = '') IS NULL
THEN
DBMS_OUTPUT.put_line('2.2 - ('''' = '''') : IS NULL');
END IF;
-- 2.3 yield: ('' <> '') : IS NULL
IF ('' <> '') IS NULL
THEN
DBMS_OUTPUT.put_line('2.3 - ('''' <> '''') : IS NULL');
END IF;
/*
* 3. 对NULL进行算术运算,得到的结果仍为NULL
*/
-- 3.1 yield:
DBMS_OUTPUT.put_line('123 + NULL =' || (123 + NULL));
DBMS_OUTPUT.put_line('123 - NULL =' || (123 - NULL));
DBMS_OUTPUT.put_line('123 * NULL =' || (123 * NULL));
DBMS_OUTPUT.put_line('123 / NULL =' || (123 / NULL));
/*
* 4. 对NULL进行concatenation运算,得到的结果为不为空的那个操作数
*/
DBMS_OUTPUT.put_line('123 || NULL =' || (123 || NULL));
END;