Oracle 空字符串

问题描述 投票:0回答:4

你们如何使用 Oracle 处理空字符串?

语句 #1:Oracle 将“varchar2”字段中的空字符串(例如 '')视为 NULL。
语句#2:我们有一个定义抽象“表结构”的模型,其中我们有字段,不能为NULL,但可以为“空”。该模型适用于各种 DBMS;几乎所有地方都很好,但 Oracle 却不然。您只是无法将空字符串插入“非空”字段。
语句#3:在我们的例子中不允许非空默认值。

那么,有人能告诉我 - 我们该如何解决这个问题吗?

oracle orm varchar2
4个回答
7
投票

这就是为什么我一直不明白为什么Oracle这么受欢迎。他们实际上并没有遵循 SQL 标准,这是基于他们多年前做出的一个愚蠢的决定。

Oracle 9i SQL Reference 指出(至少三个主要版本都有此规定):

Oracle 目前将长度为零的字符值视为空。但是,在未来的版本中,这种情况可能不会继续存在,Oracle 建议您不要将空字符串与 null 同等对待。

但他们没有说“你应该做什么”。我发现解决这个问题的唯一方法是:

有一个不能出现在真实数据中的哨兵值来表示 NULL(例如,姓氏字段的“脱氧核糖核酸”,并希望电影明星不要开始给他们的孩子奇怪的姓氏和奇怪的名字:-)。
  • 有一个单独的字段来指示第一个字段是否有效,基本上就像真实数据库对 NULL 所做的那样。

3
投票

如果您无法强制(使用)单个空格,或者可能是 Unicode 零宽度非换行空格 (U+FEFF),那么您可能必须全力以赴并使用一些令人难以置信的内容,例如 32 Z 来表明数据应该为空,但事实并非如此,因为使用的 DBMS 是 Orrible。


1
投票

您已在表上放置了 NOT NULL 约束,这与非空字符串约束相同。如果你消除这个限制,你会失去什么?


0
投票

由于 Oracle 没有改变这一点(或者至少我们不知道他们是否会改变......),这就是我为解决此问题所做的操作。

CASE WHEN RTRIM(columnname) = '' THEN ' ' ELSE RTRIM(columnname) END

或者使用 TRIM 或同时使用 LTRIM 和 RTRIM(取决于 Oracle 版本):

CASE WHEN TRIM(columnname) = '' THEN ' ' ELSE TRIM(columnname) END CASE WHEN LTRIM(RTRIM(columnname)) = '' THEN ' ' ELSE LTRIM(RTRIM(columnname)) END

我在 Oracle 19c 中测试了所有这些。

我相信论坛更适合提供解决方案,而不是抱怨问题......我希望这对某人有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.