文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

想从 Oracle 迁移到 PG 系数据库?那你知道空字符串的差异吗

2024-11-29 18:55

关注

Oracle 和 PostgreSQL 在许多情况下的行为相似,但它们的一个不同之处在于,它们对 NULL 和空字符串的处理。

Oracle 中的 NULL 和空字符串

在 Oracle 中,NULL 和空字符串在数据库中存储的值是等效的。我们将通过一个简单的表和一些数据来演示这种行为:

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 个字符的字符串。现在让我们来测试一下这些数据:

注意:请记住将默认的 null 输出从 '' 更改为 (null)

psql -P 'null=(null)'
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 |  (null) |      1 |       0 |     0 |
|  3 |         |      0 |       0 |     1 |
|  4 |       x |      0 |       0 |     0 |

这告诉我们,空字符串在插入表中时被视为 NULL,并且不能将其与常规值进行比较,就好像它是空字符串一样,因为它是完整的 NULL。因此,空字符串不能存储在数据库中。

但是,如果我们有一个单独的空格,则不会转换它,因为它不是一个空字符串。当我们有任何非空白字符时,情况也是如此;都是一样的。

PostgreSQL 中的 NULL 和空字符串

但在 PostgreSQL 中,情况有所不同。让我们再做一次同样的事情,但这次是在 PostgreSQL 中。我们不需要对上述 DDL、DML 或 SQL 进行任何更改,因此让我们看看最终得到的结果:

| id | content | isnull | isempty | blank |
|----|---------|--------|---------|-------|
|  1 |  (null) |      1 |       0 |     0 |
|  2 |         |      0 |       1 |     0 |
|  3 |         |      0 |       0 |     1 |
|  4 |       x |      0 |       0 |     0 |

我们可以忽略底部的两行,因为正如预期的那样,功能是相同的。如果我们查看前两行,我们插入的 NULL 仍然被视为 NULL,不能与空字符串进行比较。但是当我们查看为第 2 行插入的空字符串时,我们没有 NULL 值,我们仍然有一个空字符串。没有发生任何转换,我们可以看到它在查询结果中不被视为 NULL,而是一个空字符串。PostgreSQL 在处理 NULL 值时的行为遵循了 SQL 标准。

NULL 和非 NULL

Oracle 和 PostgreSQL 之间的另一个重要区别,在 NULL 值与非 NULL 字符连接时。让我们看看,如果我们尝试将 NULL 或 1 个字符的字符串连接到示例表中的值,我们会得到什么。

我们将使用的查询是:

SELECT id, content,
  content || NULL AS concatnull,
  content || 'x' AS concatchar
FROM test;

Oracle:

| ID | CONTENT | CONCATNULL | CONCATCHAR |
|----|---------|------------|------------|
|  1 |  (null) |     (null) |          x |
|  2 |  (null) |     (null) |          x |
|  3 |         |            |          x |
|  4 |       x |          x |         xx |

PostgreSQL:

| id | content | concatnull | concatchar |
|----|---------|------------|------------|
|  1 |  (null) |     (null) |     (null) |
|  2 |         |     (null) |          x |
|  3 |         |     (null) |          x |
|  4 |       x |     (null) |         xx |

有趣的是,在 Oracle 中,将 NULL 和字符连接在一起的输出值还是该字符,而在 PostgreSQL 中,连接中的任一值存在 NULL,意味着输出结果总是为 NULL 值,无论它与什么连接。

来源:红石PG内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯