• NULLs和empty strings在不同数据库的中特点


    1.以oracle为例

    SQL> create table test(id int primary key,content varchar(20));  
    SQL> INSERT INTO test (id, content) VALUES (1, NULL);
    SQL> INSERT INTO test (id, content) VALUES (2, '');
    SQL> INSERT INTO test (id, content) VALUES (3, ' ');
    SQL> INSERT INTO test (id, content) VALUES (4, 'x');
    SQL> select * from test;
    
            ID CONTENT
    ---------- --------------------
             1
             2
             3
             4 x
    
    SQL> SELECT ID,CONTENT,
         case when content is null then 1 else 0 end as isnull,
         case when content = '' then 1 else 0 end as isempty,
         case when content = ' ' then 1 else 0 end as blank 
         from
            test;
    
            ID CONTENT            ISNULL    ISEMPTY      BLANK
    ---------- -------------- ---------- ---------- ----------
             1                         1          0          0
             2                         1          0          0
             3                         0          0          1
             4 x                       0          0          0
    
    SQL> select id,content,length(content) from test;
    
            ID CONTENT              LENGTH(CONTENT)
    ---------- -------------------- ---------------
             1
             2
             3                                    1
             4 x                                  1
    
    SQL> 
    

    从结果可以看到,empry string被插入表中时,被当做NULL对待。因此,empty strings不会在数据库中存储。 单个空格是不会被转换的,因为不是一个empty string。

    2.以mysql为例

    >create table test(id int primary key,content varchar(20)); 
    >INSERT INTO test (id, content) VALUES (1, NULL);
    >INSERT INTO test (id, content) VALUES (2, '');
    >INSERT INTO test (id, content) VALUES (3, ' ');
    >INSERT INTO test (id, content) VALUES (4, 'x');
    >select * from test;
    +----+---------+
    | id | content |
    +----+---------+
    |  1 | NULL    |
    |  2 |         |
    |  3 |         |
    |  4 | x       |
    +----+---------+
    4 rows in set (0.00 sec)
    
    >SELECT ID,CONTENT,
              case when content is null then 1 else 0 end as isnull,
              case when content = '' then 1 else 0 end as isempty,
              case when content = ' ' then 1 else 0 end as blank 
              from
                 test;
    +----+---------+--------+---------+-------+
    | ID | CONTENT | isnull | isempty | blank |
    +----+---------+--------+---------+-------+
    |  1 | NULL    |      1 |       0 |     0 |
    |  2 |         |      0 |       1 |     1 |
    |  3 |         |      0 |       1 |     1 |
    |  4 | x       |      0 |       0 |     0 |
    +----+---------+--------+---------+-------+
    4 rows in set (0.00 sec)
    
    >select id,content,length(content) from test;
    +----+---------+-----------------+
    | id | content | length(content) |
    +----+---------+-----------------+
    |  1 | NULL    |            NULL |
    |  2 |         |               0 |
    |  3 |         |               1 |
    |  4 | x       |               1 |
    +----+---------+-----------------+

    可以看到NULL和empty string是不同的。而empty string和空格string被认为是相同的,但是在计算长度的时候却又不同了。

    3.以pg为例

    postgres=# create table test(id int primary key,content varchar(20)); 
    postgres=# INSERT INTO test (id, content) VALUES (1, NULL);
    postgres=# INSERT INTO test (id, content) VALUES (2, '');
    postgres=# INSERT INTO test (id, content) VALUES (3, ' ');
    postgres=# INSERT INTO test (id, content) VALUES (4, 'x');
    postgres=# select * from test;
     id | content 
    ----+---------
      1 | 
      2 | 
      3 |  
      4 | x
    (4 rows)
    postgres=# SELECT ID,CONTENT,
               case when content is null then 1 else 0 end as isnull,
               case when content = '' then 1 else 0 end as isempty,
               case when content = ' ' then 1 else 0 end as blank 
               from test;
    		   
     id | content | isnull | isempty | blank 
    ----+---------+--------+---------+-------
      1 |         |      1 |       0 |     0
      2 |         |      0 |       1 |     0
      3 |         |      0 |       0 |     1
      4 | x       |      0 |       0 |     0
    (4 rows)
    
    
    postgres=# select id,content,length(content) from test;
     id | content | length 
    ----+---------+--------
      1 |         |       
      2 |         |      0
      3 |         |      1
      4 | x       |      1
    (4 rows)
    
    postgres=# 
    

    看前两行,NULL被插入后仍被当做NULL,不能当做empty string。从第二行可以看到,插入的empty string没有被当做NULL,仍然是一个empty string。

    NULLs和non-NULLs

    (1)oracle数据库

    SQL> SELECT id, content,
          content || NULL AS concatnull,
          content || 'x' AS concatchar
        FROM test;
    
            ID CONTENT              CONCATNULL           CONCATCHAR
    ---------- -------------------- -------------------- ---------------------
             1                                           x
             2                                           x
             3                                            x
             4 x                    x                    xx
    
    SQL> 
    

    在oracle中,NULLs和字符相连接后,输出结果是字符。

    (2)mysql数据库

    >SELECT id, content,
           content || NULL AS concatnull,
           content || 'x' AS concatchar
         FROM test;
    +----+---------+------------+------------+
    | id | content | concatnull | concatchar |
    +----+---------+------------+------------+
    |  1 | NULL    |       NULL |       NULL |
    |  2 |         |       NULL |          0 |
    |  3 |         |       NULL |          0 |
    |  4 | x       |       NULL |          0 |
    +----+---------+------------+------------+
    

    mysql中可以用concat拼接多个,但用||无法拼接字符串,会显示零。

    >SELECT id, content,
                concat(content,NULL) AS concatnull,
                concat(content,'x') AS concatchar
              FROM test;
    +----+---------+------------+------------+
    | id | content | concatnull | concatchar |
    +----+---------+------------+------------+
    |  1 | NULL    | NULL       | NULL       |
    |  2 |         | NULL       | x          |
    |  3 |         | NULL       |  x         |
    |  4 | x       | NULL       | xx         |
    +----+---------+------------+------------+
    

    NULL和non-NULLS拼接结果是NULL

    (3)pg数据库

    postgres=# SELECT id, content,
    postgres-#   content || NULL AS concatnull,
    postgres-#   content || 'x' AS concatchar
    postgres-# FROM test;
     id | content | concatnull | concatchar 
    ----+---------+------------+------------
      1 |         |            | 
      2 |         |            | x
      3 |         |            |  x
      4 | x       |            | xx
    (4 rows)
    
    postgres=# 
    

    在pg中,NULLs和字符相连接后,NULL出现在任何一个值中都意味着结果是NULL作为输出值,而不管它连接的是什么。

      

  • 相关阅读:
    周五,远程连接及总体流程
    C++ 图片浏览
    深度解析Java内存的原型
    找不到class
    js读写cookie
    不利用临时变量,交换两个变量的值
    插入排序
    算法:一个排序(第一个最大,第二个最小,第三个其次大,第四其次小...)
    c#缓存介绍(1)
    JavaScript中创建自定义对象
  • 原文地址:https://www.cnblogs.com/abclife/p/13629371.html
Copyright © 2020-2023  润新知