代码改变世界

oracle和postgresql中对待NULLs和空字符串(empty string)的方式

  abce  阅读(3210)  评论(0编辑  收藏  举报

oracle和postgresql中对待NULLs和空字符(empty string)的方式是不同的。

 

oracle中的NULLs和空字符串(empty string)

在oracle中,NULLs和空字符串存储在数据库中是等价的。

1
2
3
4
5
6
CREATE TABLE test ( id NUMERIC ( 3, 0 ) PRIMARY KEY, content VARCHAR ( 255 ) );
 
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');

  

这里我们显式插入了NULL和一个空字符串、一个只有单个空格的字符串。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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>

这里可以看出,插入数据库后,空字符串被当做NULL处理了。也就是说空字符串(empty string)在数据库中是不能存储的。

而只有单个空格的字符串是不会被转成NULL的。因为它并不是空字符串(empty string)

 

postgresql中的NULLs和空字符串(empty string)

使用相同的表结构

1
2
3
4
5
6
7
8
9
10
11
12
13
postgres@=#SELECT id,content,
postgres-#     CASE WHEN content IS NULL THEN 1 ELSE 0 END AS isnull,
postgres-#     CASE WHEN content = '' THEN 1 ELSE 0 END AS isempty,
postgres-#     CASE WHEN content = ' ' THEN 1 ELSE 0 END AS blank
postgres-# FROM
postgres-#     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)

插入的NULL仍然是NULL,不能和空字符串进行比较;插入的空字符串也没有被转化成NULL。

 

另一个不同是oracle和postgresql中对NULL和非空字符的连接操作

oracle中

1
2
3
4
5
6
7
8
9
10
11
12
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

oracle将NULL和一个字符连接后,将字符作为结果返回。

 

postgresql中

1
2
3
4
5
6
7
8
9
10
11
postgres@=#SELECT id,content,
postgres-#      content || NULL AS concatnull,
postgres-#      content || 'x' AS concatchar
postgres-#   FROM
postgres-#      test;
 id | content | concatnull | concatchar
----+---------+------------+------------
  1 |         |            |
  2 |         |            | x
  3 |         |            |  x
  4 | x       |            | xx

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

 

编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示