PL/SQL中‘’(空串)与Null的区别

大家对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;


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值